基于ArcGIS10.0和Oracle10g的空间数据管理平台十二(C#开发)-元数据库库管理-程序员宅基地

技术标签: 数据库  

我的新浪微博:http://weibo.com/freshairbrucewoo

欢迎大家相互交流,共同提高技术。

    由于前段时间工作很忙而且出差去了北京一个多月,所以很久没有介绍了关于基于ArcGIS10.0和Oracle10g的空间数据管理平台这个项目的相关功能实现了,今天开始介绍一个新的功能实现,就是元数据库的管理。

    所谓元数据就是描述数据的数据,元数据库就是存放描述数据的数据。元数据主要用于描述数据的特征等的数据,在很多场合下都会遇到元数据,例如文件系统里面有。这里介绍的元数据主要是指描述空间数据特征的元数据,例如属于哪一类数据等。

    今天由于时间关系就简单介绍一下元数据库管理的实现。

1.初始化显示元数据库信息的头部信息

 1         /// <summary>
2 /// 初始化datagridView的头部显示信息
3 /// </summary>
4 private void InitDataGridView()
5 {
6 //dataGridViewX1.Rows.Clear();
7 SqlHelper sh = new SqlHelper();
8 string sql = "select id,name,description from jcsjk_databaseinfo";
9 DataSet ds = sh.ReturnDataSet(sql, "jcsjk_databaseinfo");
10 dataGridViewX1.DataSource = ds.Tables[0];
11
12 dataGridViewX1.Columns[0].HeaderText = "元数据库ID";
13 dataGridViewX1.Columns[0].Width = 200;
14 dataGridViewX1.Columns[1].HeaderText = "元数据库名称";
15 dataGridViewX1.Columns[1].Width = 200;
16
17 dataGridViewX1.Columns[2].HeaderText = "元数据库描述信息";
18 dataGridViewX1.Columns[2].Width = 200;
19
20 }


 

2.删除元数据库

 1        /// <summary>
2 /// 删除元数据库
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void delMetaDatabaseBtn_Click(object sender, EventArgs e)
7 {
8 //1.删除所有表
9 if (dataGridViewX1.CurrentRow.Index < 0)
10 {
11 MessageBox.Show("请选择需要删除的数据库那一行");
12 return;
13 }
14 string strDatabaseName = dataGridViewX1.Rows[dataGridViewX1.CurrentRow.Index].Cells[1].Value.ToString();
15 SqlHelper sh = new SqlHelper();
16 string sql = "select table_name from user_tables where table_name like '" +
17 strDatabaseName.ToUpper() + "/_%' ESCAPE '/'";
18 OracleDataReader odr = sh.ReturnDataReader(sql);
19
20 while (odr.Read())
21 {
22 //删除关联外键
23 string strTemp = odr[0].ToString().ToUpper();
24 strTemp = strTemp.Substring(strDatabaseName.Length + 1);
25 sql = "select table_name,constraint_name from user_constraints where constraint_type='R'"
26 + " and constraint_name like '" + strTemp + "%'";
27 OracleDataReader odr1 = sh.ReturnDataReader(sql);
28
29 while (odr1.Read())
30 {
31 sql = "ALTER TABLE " + odr1[0].ToString().ToUpper() + " DROP CONSTRAINT "
32 + odr1[1].ToString().ToUpper();
33 sh.ExecuteSQL(sql);
34 }
35 sql = "drop table " + odr[0].ToString().ToUpper();
36 sh.ExecuteSQL(sql);
37 }
38 //2.删除记录
39 Hashtable ht = new Hashtable();
40 ht.Add("name", strDatabaseName);
41 try
42 {
43 sh.Del("jcsjk_databaseinfo", "name='" + strDatabaseName + "'", ht);
44 }
45 catch (Exception)
46 {
47 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
48 "删除元数据库<" + strDatabaseName + ">失败!");
49 MessageBox.Show("删除元数据库<" + strDatabaseName + ">失败!");
50 }
51
52 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
53 "删除元数据库<" + strDatabaseName + ">成功!");
54 MessageBox.Show("删除元数据库<" + strDatabaseName + ">成功!");
55 }
56
57

 

3.清空元数据库

 1         /// <summary>
2 /// 清空元数据库中的数据
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 private void clearMetaDataBtn_Click(object sender, EventArgs e)
7 {
8 if (dataGridViewX1.CurrentRow.Index < 0)
9 {
10 MessageBox.Show("选择数据库!");
11 return;
12 }
13 SqlHelper sh = new SqlHelper();
14 string strDatabaseName = dataGridViewX1.CurrentRow.Cells[1].Value.ToString();
15 //NewDataSet nds = new NewDataSet();
16 string sql = string.Empty;
17 sql = "select table_name from user_tables where table_name like '" +
18 strDatabaseName.ToUpper() + "/_%' ESCAPE '/'";
19 OracleDataReader odr = sh.ReturnDataReader(sql);
20
21 while (odr.Read())
22 {
23 sql = "delete from " + odr[0].ToString().ToUpper();
24 try
25 {
26 sh.ExecuteSQL(sql);
27 }
28 catch (Exception)
29 {
30 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
31 "清空元数据库<" + strDatabaseName + ">的数据失败!");
32 MessageBox.Show("清空元数据库<" + strDatabaseName + ">的数据失败!");
33 return;
34 }
35 }
36 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
37 "清空元数据库<" + strDatabaseName + ">的数据成功!");
38 MessageBox.Show("清空元数据库<" + strDatabaseName + ">的数据成功!");
39 /*
40 foreach (DataTable dt in nds.Tables)
41 {
42 string strTableName = strDatabaseName + "_" + dt.TableName;
43 sql = "select * from " + strTableName;
44 DataSet ds = new DataSet();
45
46 OracleDataAdapter oda = new OracleDataAdapter(sql,
47 ConfigurationSettings.AppSettings["ConnectionString"]);
48 try
49 {
50 oda.Fill(ds);
51 oda.Update(dt);
52 }
53 catch (Exception ex)
54 {
55 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
56 "清空元数据库<" + strDatabaseName + ">的数据失败!");
57 MessageBox.Show("清空元数据库<" + strDatabaseName + ">的数据失败!");
58 }
59 }
60 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
61 "清空元数据库<" + strDatabaseName + ">的数据成功!");
62 MessageBox.Show("清空元数据库<" + strDatabaseName + ">的数据成功!");
63 * */
64 }

 

    清空元数据库与删除元数据库是不同的功能,删除元数据库就是把存放元数据的库都一起删除了,但是清空元数据库只是把库里面的内容删除,库本身存在。

4.创建元数据库

    这是比较复杂的一个功能,因为创建一个元数据库需要根据一定的标准来创建,这些标准都是通过xsd文件描述的,所以首先要解析这个xml的模式描述文件,然后根据解析的内容存放到相应的字段中去,具体实现如下:

  1         private void createBtn_Click(object sender, EventArgs e)
2 {
3 SqlHelper sh = new SqlHelper();
4 string sql = string.Empty;
5
6 if (databaseIDTxt.Text.Trim() == "" || databaseNameTxt.Text.Trim() == "")
7 {
8 errTxt.Text = "数据库ID或名称不能为空.";
9 return;
10 }
11
12 //查看元数据库是否存在
13 sql = "select * from jcsjk_databaseinfo where name='" + databaseNameTxt.Text + "'";
14
15 if (sh.GetRecordCount(sql) > 0)
16 {
17 MessageBox.Show("此元数据库已经存在,请从新命名元数据库!");
18 return;
19 }
20
21 Hashtable ht = new Hashtable();
22 string strContent = string.Empty;
23 DataSet ds = new DataSet();
24 //从文件标准创建
25 if (!checkBoxX1.Checked)
26 {
27 if (metaFileTxt.Text == "" || Path.GetExtension(metaFileTxt.Text).ToLower() != ".xsd")
28 {
29 errTxt.Text = "请选择正确的XSD文件.";
30 return;
31 }
32 if (metaIDTxt.Text.Trim() == "")
33 {
34 errTxt.Text = "元数据标准ID不能为空.";
35 return;
36 }
37
38 //1.读入xsd文件
39 ds.ReadXmlSchema(metaFileTxt.Text);
40
41 //2.create table in tablespace
42 try
43 {
44 OracleDataSchemaAdapter odsa = new OracleDataSchemaAdapter();
45 odsa.Create(ds, true, databaseNameTxt.Text + "_", "SDE");
46 }
47 catch (ArgumentException ae)
48 {
49 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
50 "创建元数据库<" + databaseNameTxt.Text + ">失败!");
51 MessageBox.Show("-- Error --" + ae.Message + "-- Instructions --");
52 }
53 catch (FileNotFoundException)
54 {
55 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
56 "创建元数据库<" + databaseNameTxt.Text + ">失败!");
57 MessageBox.Show("File not found: " + metaFileTxt.Text);
58 }
59 catch (Exception)
60 {
61 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
62 "创建元数据库<" + databaseNameTxt.Text + ">失败!");
63 MessageBox.Show("创建元数据库<" + databaseNameTxt.Text + ">失败!");
64 }
65
66 //写入元数据标准到数据库
67 StreamReader sr = new StreamReader(new FileStream(metaFileTxt.Text, FileMode.Open),
68 System.Text.Encoding.GetEncoding("GB2312"));
69
70 while (!sr.EndOfStream)
71 {
72 strContent += sr.ReadLine();
73 }
74 sr.Close();
75 string strName = Path.GetFileNameWithoutExtension(metaFileTxt.Text);
76 //
77 sql = "select * from jcsjk_databaseinfo where name='" + strName + "'";
78 if (sh.GetRecordCount(sql) <= 0)
79 {
80 XmlDocument xmlDoc = new XmlDocument();
81 xmlDoc.Load(metaFileTxt.Text);
82 XmlNodeList xnl = xmlDoc.GetElementsByTagName("xs:schema");
83 XmlNode xn = xnl[0];
84 //插入元数据标准到数据库中,用参数才能插入,因为content字段内容太大
85 sql = "insert into jcsjk_metastand (id, name, content, org, version) values("
86 + ":id,:name,:content,:org,:version)";
87 OracleParameter[] op = new OracleParameter[5];
88 op[0] = new OracleParameter();
89 op[0].ParameterName = "id";
90 op[0].OracleType = OracleType.NVarChar;
91 op[0].Value = metaIDTxt.Text;
92 op[1] = new OracleParameter();
93 op[1].ParameterName = "name";
94 op[1].OracleType = OracleType.NVarChar;
95
96 string strValue = xn.ChildNodes[0].ChildNodes[1].InnerText;
97
98 strValue = strValue.Substring(strValue.IndexOf('') + 1);
99 op[1].Value = strValue;
100 op[2] = new OracleParameter();
101 op[2].ParameterName = "content";
102 op[2].OracleType = OracleType.Clob;
103 op[2].Value = strContent;
104 strValue = xn.ChildNodes[0].ChildNodes[2].InnerText;
105 strValue = strValue.Substring(strValue.IndexOf('') + 1);
106 op[3] = new OracleParameter();
107 op[3].ParameterName = "org";
108 op[3].OracleType = OracleType.NVarChar;
109 op[3].Value = strValue;
110 strValue = xn.ChildNodes[0].ChildNodes[0].InnerText;
111 strValue = strValue.Substring(strValue.IndexOf('') + 1);
112 op[4] = new OracleParameter();
113 op[4].ParameterName = "version";
114 op[4].OracleType = OracleType.NVarChar;
115 op[4].Value = strValue;
116 try
117 {
118 sh.ExecuteNonQuery(sql, op);
119 }
120 catch (Exception ex)
121 {
122 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
123 "写入元数据标准<" + strName + ">到数据库失败!");
124 MessageBox.Show("写入元数据标准<<" + strName + ">到数据库失败!");
125 }
126 }
127 }
128 //从数据库以存储的标准创建
129 else
130 {
131 string strStandName = comboBoxEx1.SelectedItem.ToString();
132
133 sql = "select content from jcsjk_metastand where name='" + strStandName + "'";
134 OracleDataReader odr = sh.ReturnDataReader(sql);
135 if (odr.Read())
136 {
137 StreamWriter bw = new StreamWriter(new FileStream("temp.xsd", FileMode.Create),
138 System.Text.Encoding.GetEncoding("GB2312"));
139
140 bw.Write(odr[0].ToString());
141
142 bw.Close();
143 ds.ReadXmlSchema("temp.xsd");
144 System.IO.File.Delete("temp.xsd");
145 try
146 {
147 OracleDataSchemaAdapter odsa = new OracleDataSchemaAdapter();
148 odsa.Create(ds, true, databaseNameTxt.Text + "_", "SDE");
149 }
150 catch (ArgumentException ae)
151 {
152 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
153 "创建元数据库<" + databaseNameTxt.Text + ">失败!");
154 MessageBox.Show("-- Error --" + ae.Message + "-- Instructions --");
155 }
156 catch (FileNotFoundException)
157 {
158 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
159 "创建元数据库<" + databaseNameTxt.Text + ">失败!");
160 MessageBox.Show("File not found: " + metaFileTxt.Text);
161 }
162 catch (Exception)
163 {
164 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
165 "创建元数据库<" + databaseNameTxt.Text + ">失败!");
166 MessageBox.Show("创建元数据库<" + databaseNameTxt.Text + ">失败!");
167 }
168 }
169
170 }
171
172 //插入元数据库信息到数据库
173 sql = "select * from jcsjk_databaseinfo where name='" + databaseNameTxt.Text + "'";
174 if (sh.GetRecordCount(sql) <= 0)
175 {
176 ht.Clear();
177 ht.Add("ID", databaseIDTxt.Text);
178 ht.Add("NAME", databaseNameTxt.Text);
179 if (descriptionText.Text != "")
180 {
181 ht.Add("DESCRIPTION", descriptionText.Text);
182 }
183 try
184 {
185 sh.Insert("jcsjk_databaseinfo", ht);
186 }
187 catch (Exception)
188 {
189 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
190 "插入元数据库<" + databaseNameTxt.Text + ">信息到数据库失败!");
191 MessageBox.Show("插入元数据库<<" + databaseNameTxt.Text + ">信息到数据库失败!");
192 }
193 }
194
195 LogHelp.writeLog(FrmMain.metaUsername, "元数据库管理",
196 "创建元数据库<" + databaseNameTxt.Text + ">成功!");
197 MessageBox.Show("创建元数据库<" + databaseNameTxt.Text + ">成功!");
198 Close();
199 }

 

    到此元数据库的管理基本内容已经介绍完毕。

转载于:https://www.cnblogs.com/brucewoo/archive/2012/02/01/2334082.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30849591/article/details/94957525

智能推荐

<VBScript>终极破产版石头剪刀布游戏(VBS语言实现)_vbs石头剪刀布-程序员宅基地

文章浏览阅读1.8k次,点赞6次,收藏4次。前几天拜读失泽久雄先生所著写的《计算机是怎样跑起来的》,当时看书中的代码用VBS语言写的一个石头剪刀布游戏特别好玩,于是手敲了一遍,并做了些改进——石头剪刀布小游戏。结果后来给一个朋友看,发现有bug,于是又在网上查了些资料,做了一些改进,此次带来石头剪刀布3.0破产版,哈哈哈。以下为代码实现,尽管简陋,不过有兴趣玩的朋友可以用Windows自带的笔记本把下面的代码粘过去,文档后缀名改成 .V..._vbs石头剪刀布

就是要让你搞懂Nginx,这篇就够了!-程序员宅基地

文章浏览阅读98次。开源Linux长按二维码加关注~作者:渐暖°出处:blog.csdn.net/yujing1314/article/details/107000737来源:公众号51CTO技术栈Ng..._nginx不开源的如何使用

JavaWeb书城项目(二)——用户注册和登录_传智书城项目设计报告 javaweb用户注册-程序员宅基地

文章浏览阅读1.7k次,点赞3次,收藏17次。之前已经做好前端页面,现在要通过 servlet 程序以及 JDBC 具体实现用户注册和登录JavaEE项目的三层架构为什么要分层呢?通过一层完成所有事情不行吗?分层的目的是为了解耦。解耦就是为了降低代码的耦合度。方便项目后期的维护和升级。我们知道有些项目代码量是巨大的,如果放在一层后期维护和升级会很麻烦,如果分出不同的层,每层都有不同负责的人员,那么维护和升级会变得轻松很多。需要的接口和类web 层 com.atguigu.web/servlet/controllerservice 层._传智书城项目设计报告 javaweb用户注册

Ubuntu 系统 安装完Nginx和php后 能打开html .php提示下载或者connect() failed (111: Connection refused) while connectin_unix:/run/php/php8.3-fpm.sock failed (111: unknown-程序员宅基地

文章浏览阅读175次。php 版本为7.11.vim www.conf保存退出 重启php2.配置Nginx服务器vim /etc/nginx/nginx.conf在http{}中末尾添加或者在引用服务器域名配置的文件夹下新建一个文件也行我不知道为什么用fastcgi_pass unix:/var/run/php/php7.1-fpm.sock这个不行 但是fastcgi_pass 127.0.0..._unix:/run/php/php8.3-fpm.sock failed (111: unknown error) while connecti

k8s-高可用部署-calico插件_calico-3.9.2.yaml-程序员宅基地

文章浏览阅读2.6k次。kubernetes高可用部署参考:Creating Highly Available Clusters with kubeadm | KubernetesGitHub - kubernetes-sigs/kubespray: Deploy a Production Ready Kubernetes ClusterGitHub - wise2c-devops/breeze: Deploy a Production Ready Kubernetes Cluster with graphical interfa_calico-3.9.2.yaml

java 爬虫 抓取关键字_爬虫任务二:爬取(用到htmlunit和jsoup)通过百度搜索引擎关键字搜取到的新闻标题和url,并保存在本地文件中(主体借鉴了网上的资料)...-程序员宅基地

文章浏览阅读760次。packagecom.zhaowu.renwu2;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.net.MalformedURLException;importjava.net.URL;import..._爬虫java 无url通过文字抓取内容

随便推点

service和systemctl的区别_systemctl service-程序员宅基地

文章浏览阅读1w次,点赞8次,收藏49次。Linux服务管理的两种方式service和systemctl。serviceservice命令其实是去/etc/init.d目录下,去执行相关程序,init.d目录包含许多系统各种服务的启动和停止脚本。当Linux启动时,会寻找这些目录中的服务脚本,并根据脚本的run level确定不同的启动级别。参考这篇文章,了解系统启动的过程及centos和ubuntu的区别。service的常用方式:1.格式:service <service>打印指定服务<service>的_systemctl service

Spine 事件-程序员宅基地

文章浏览阅读5k次。Spine 事件大家好,我是笨笨,笨笨的笨,笨笨的笨,谢谢!欢迎加入专业Spine技术交流群 Spine2D骨骼动画 7708065此文最初发表在群论坛,但后来腾讯放弃了群论坛所以迁至此处转载请保留原始链接:https://blog.csdn.net/jx520/article/details/83047366事件是动画过程中所发生情况的触发器。例如,当人物碰到地面发出声音。事件不限于音..._spine 事件

UNITY中判断两个点之间距离的方法_unity 判断两个距离-程序员宅基地

文章浏览阅读3.1k次,点赞3次,收藏4次。Vector3.SqrMagnitude与Vector3.Distance_unity 判断两个距离

Idea设置未使用的方法,变量的提示颜色_idea 更改未使用变量的颜色-程序员宅基地

文章浏览阅读2.8w次,点赞6次,收藏14次。修改未被调用的变量,方法的提示,方便观赏代码_idea 更改未使用变量的颜色

在Linux系统下C语言编译过程的四个步骤_linux下编写一个c程序的基本过程分为几部分?-程序员宅基地

文章浏览阅读2.7k次,点赞7次,收藏23次。1. 简介C语言程序从源代码到可执行文件(二进制文件)都经历了那些过程?本文以Linux下C语言的编译过程为例,讲解C语言程序的编译过程。以hello.c文件为例:#include <stdio.h>int main(){ printf("hello world!\n");}在linux下编译C程序:$ gcc hello.c -o hello # 编译$ ./hello # 执行hello world! # 输出文本2. 编译的步骤gcc命令编译C语言的过程中_linux下编写一个c程序的基本过程分为几部分?

pyqt5界面开发-制作程序集合桌面-基本的框架_用pyqt做程序集合的界面-程序员宅基地

文章浏览阅读340次。pyqt5界面开发-制作多个小程序-基本的框架和思路最近现在无事,看到了电脑桌面,又想到了最近入门的pyqt5,再看看以往的程序,想到了可不可以做一个集成的UI桌面_用pyqt做程序集合的界面