基于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

智能推荐

软件测试流程包括哪些内容?测试方法有哪些?_测试过程管理中包含哪些过程-程序员宅基地

文章浏览阅读2.9k次,点赞8次,收藏14次。测试主要做什么?这完全都体现在测试流程中,同时测试流程是面试问题中出现频率最高的,这不仅是因为测试流程很重要,而是在面试过程中这短短的半小时到一个小时的时间,通过测试流程就可以判断出应聘者是否合适,故在测试流程中包含了测试工作的核心内容,例如需求分析,测试用例的设计,测试执行,缺陷等重要的过程。..._测试过程管理中包含哪些过程

政府数字化政务的人工智能与机器学习应用:如何提高政府工作效率-程序员宅基地

文章浏览阅读870次,点赞16次,收藏19次。1.背景介绍政府数字化政务是指政府利用数字技术、互联网、大数据、人工智能等新技术手段,对政府政务进行数字化改革,提高政府工作效率,提升政府服务质量的过程。随着人工智能(AI)和机器学习(ML)技术的快速发展,政府数字化政务中的人工智能与机器学习应用也逐渐成为政府改革的重要内容。政府数字化政务的人工智能与机器学习应用涉及多个领域,包括政策决策、政府服务、公共安全、社会治理等。在这些领域,人工...

ssm+mysql+微信小程序考研刷题平台_mysql刷题软件-程序员宅基地

文章浏览阅读219次,点赞2次,收藏4次。系统主要的用户为用户、管理员,他们的具体权限如下:用户:用户登录后可以对管理员上传的学习视频进行学习。用户可以选择题型进行练习。用户选择小程序提供的考研科目进行相关训练。用户可以进行水平测试,并且查看相关成绩用户可以进行错题集的整理管理员:管理员登录后可管理个人基本信息管理员登录后可管理个人基本信息管理员可以上传、发布考研的相关例题及其分析,并对题型进行管理管理员可以进行查看、搜索考研题目及错题情况。_mysql刷题软件

根据java代码描绘uml类图_Myeclipse8.5下JAVA代码导成UML类图-程序员宅基地

文章浏览阅读1.4k次。myelipse里有UML1和UML2两种方式,UML2功能更强大,但是两者生成过程差别不大1.建立Test工程,如下图,uml包存放uml类图package com.zz.domain;public class User {private int id;private String name;public int getId() {return id;}public void setId(int..._根据以下java代码画出类图

Flume自定义拦截器-程序员宅基地

文章浏览阅读174次。需求:一个topic包含很多个表信息,需要自动根据json字符串中的字段来写入到hive不同的表对应的路径中。发送到Kafka中的数据原本最外层原本没有pkDay和project,只有data和name。因为担心data里面会空值,所以根同事商量,让他们在最外层添加了project和pkDay字段。pkDay字段用于表的自动分区,proejct和name合起来用于自动拼接hive表的名称为 ..._flume拦截器自定义开发 kafka

java同时输入不同类型数据,Java Spring中同时访问多种不同数据库-程序员宅基地

文章浏览阅读380次。原标题:Java Spring中同时访问多种不同数据库 多样的工作要求,可以使用不同的工作方法,只要能获得结果,就不会徒劳。开发企业应用时我们常常遇到要同时访问多种不同数据库的问题,有时是必须把数据归档到某种数据仓库中,有时是要把数据变更推送到第三方数据库中。使用Spring框架时,使用单一数据库是非常容易的,但如果要同时访问多个数据库的话事件就变得复杂多了。本文以在Spring框架下开发一个Sp..._根据输入的不同连接不同的数据库

随便推点

EFT试验复位案例分析_eft电路图-程序员宅基地

文章浏览阅读3.6k次,点赞9次,收藏25次。本案例描述了晶振屏蔽以及开关电源变压器屏蔽对系统稳定工作的影响, 硬件设计时应考虑。_eft电路图

MR21更改价格_mr21 对于物料 zba89121 存在一个当前或未来标准价格-程序员宅基地

文章浏览阅读1.1k次。对于物料价格的更改,可以采取不同的手段:首先,我们来介绍MR21的方式。 需要说明的是,如果要对某一产品进行价格修改,必须满足的前提条件是: ■ 1、必须对价格生效的物料期间与对应会计期间进行开启; ■ 2、该产品在该物料期间未发生物料移动。执行MR21,例如更改物料1180051689的价格为20000元,系统提示“对于物料1180051689 存在一个当前或未来标准价格”,这是因为已经对该..._mr21 对于物料 zba89121 存在一个当前或未来标准价格

联想启天m420刷bios_联想启天M420台式机怎么装win7系统(完美解决usb)-程序员宅基地

文章浏览阅读7.4k次,点赞3次,收藏13次。[文章导读]联想启天M420是一款商用台式电脑,预装的是win10系统,用户还是喜欢win7系统,该台式机采用的intel 8代i5 8500CPU,在安装安装win7时有很多问题,在安装win7时要在BIOS中“关闭安全启动”和“开启兼容模式”,并且安装过程中usb不能使用,要采用联想win7新机型安装,且默认采用的uefi+gpt模式,要改成legacy+mbr引导,那么联想启天M420台式电..._启天m420刷bios

冗余数据一致性,到底如何保证?-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏9次。一,为什么要冗余数据互联网数据量很大的业务场景,往往数据库需要进行水平切分来降低单库数据量。水平切分会有一个patition key,通过patition key的查询能..._保证冗余性

java 打包插件-程序员宅基地

文章浏览阅读88次。是时候闭环Java应用了 原创 2016-08-16 张开涛 你曾经因为部署/上线而痛苦吗?你曾经因为要去运维那改配置而烦恼吗?在我接触过的一些部署/上线方式中,曾碰到过以下一些问题:1、程序代码和依赖都是人工上传到服务器,不是通过工具进行部署和发布;2、目录结构没有规范,jar启动时通过-classpath任意指定;3、fat jar,把程序代码、配置文件和依赖jar都打包到一个jar中,改配置..._那么需要把上面的defaultjavatyperesolver类打包到插件中

VS2015,Microsoft Visual Studio 2005,SourceInsight4.0使用经验,Visual AssistX番茄助手的安装与基本使用9_番茄助手颜色-程序员宅基地

文章浏览阅读909次。1.得下载一个番茄插件,按alt+g才可以有函数跳转功能。2.不安装番茄插件,按F12也可以有跳转功能。3.进公司的VS工程是D:\sync\build\win路径,.sln才是打开工程的方式,一个是VS2005打开的,一个是VS2013打开的。4.公司库里的线程接口,在CmThreadManager.h 里,这个里面是我们的线程库,可以直接拿来用。CreateUserTaskThre..._番茄助手颜色

推荐文章

热门文章

相关标签