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

 

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

posted @ 2012-02-01 00:08  蔷薇理想人生  阅读(2084)  评论(0编辑  收藏  举报