基于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 }
到此元數據庫的管理基本內容已經介紹完畢。
浙公網安備 33010602011771號