由於前段時間工作很忙而且出差去了北京一個多月,所以很久沒有介紹了關於基於ArcGIS10.0和Oracle10g的空間數據管理平臺這個項目的相關功能實現了,今天開始介紹一個新的功能實現,就是元數據庫的管理。
所謂元數據就是描述數據的數據,元數據庫就是存放描述數據的數據。元數據主要用於描述數據的特徵等的數據,在很多場合下都會遇到元數據,例如文件系統裏面有。這裏介紹的元數據主要是指描述空間數據特徵的元數據,例如屬於哪一類數據等。
今天由於時間關係就簡單介紹一下元數據庫管理的實現。
1.初始化顯示元數據庫信息的頭部信息
- /// <summary>
- /// 初始化datagridView的頭部顯示信息
- /// </summary>
- private void InitDataGridView()
- {
- //dataGridViewX1.Rows.Clear();
- SqlHelper sh = new SqlHelper();
- string sql = "select id,name,description from jcsjk_databaseinfo";
- DataSet ds = sh.ReturnDataSet(sql, "jcsjk_databaseinfo");
- dataGridViewX1.DataSource = ds.Tables[0];
- dataGridViewX1.Columns[0].HeaderText = "元數據庫ID";
- dataGridViewX1.Columns[0].Width = 200;
- dataGridViewX1.Columns[1].HeaderText = "元數據庫名稱";
- dataGridViewX1.Columns[1].Width = 200;
- dataGridViewX1.Columns[2].HeaderText = "元數據庫描述信息";
- dataGridViewX1.Columns[2].Width = 200;
- }
2.刪除元數據庫
- /// <summary>
- /// 刪除元數據庫
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void delMetaDatabaseBtn_Click(object sender, EventArgs e)
- {
- //1.刪除所有表
- if (dataGridViewX1.CurrentRow.Index < 0)
- {
- MessageBox.Show("請選擇需要刪除的數據庫那一行");
- return;
- }
- string strDatabaseName = dataGridViewX1.Rows[dataGridViewX1.CurrentRow.Index].Cells[1].Value.ToString();
- SqlHelper sh = new SqlHelper();
- string sql = "select table_name from user_tables where table_name like '" +
- strDatabaseName.ToUpper() + "/_%' ESCAPE '/'";
- OracleDataReader odr = sh.ReturnDataReader(sql);
- while (odr.Read())
- {
- //刪除關聯外鍵
- string strTemp = odr[0].ToString().ToUpper();
- strTemp = strTemp.Substring(strDatabaseName.Length + 1);
- sql = "select table_name,constraint_name from user_constraints where constraint_type='R'"
- + " and constraint_name like '" + strTemp + "%'";
- OracleDataReader odr1 = sh.ReturnDataReader(sql);
- while (odr1.Read())
- {
- sql = "ALTER TABLE " + odr1[0].ToString().ToUpper() + " DROP CONSTRAINT "
- + odr1[1].ToString().ToUpper();
- sh.ExecuteSQL(sql);
- }
- sql = "drop table " + odr[0].ToString().ToUpper();
- sh.ExecuteSQL(sql);
- }
- //2.刪除記錄
- Hashtable ht = new Hashtable();
- ht.Add("name", strDatabaseName);
- try
- {
- sh.Del("jcsjk_databaseinfo", "name='" + strDatabaseName + "'", ht);
- }
- catch (Exception)
- {
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "刪除元數據庫<" + strDatabaseName + ">失敗!");
- MessageBox.Show("刪除元數據庫<" + strDatabaseName + ">失敗!");
- }
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "刪除元數據庫<" + strDatabaseName + ">成功!");
- MessageBox.Show("刪除元數據庫<" + strDatabaseName + ">成功!");
- }
3.清空元數據庫
- /// <summary>
- /// 清空元數據庫中的數據
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void clearMetaDataBtn_Click(object sender, EventArgs e)
- {
- if (dataGridViewX1.CurrentRow.Index < 0)
- {
- MessageBox.Show("選擇數據庫!");
- return;
- }
- SqlHelper sh = new SqlHelper();
- string strDatabaseName = dataGridViewX1.CurrentRow.Cells[1].Value.ToString();
- //NewDataSet nds = new NewDataSet();
- string sql = string.Empty;
- sql = "select table_name from user_tables where table_name like '" +
- strDatabaseName.ToUpper() + "/_%' ESCAPE '/'";
- OracleDataReader odr = sh.ReturnDataReader(sql);
- while (odr.Read())
- {
- sql = "delete from " + odr[0].ToString().ToUpper();
- try
- {
- sh.ExecuteSQL(sql);
- }
- catch (Exception)
- {
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "清空元數據庫<" + strDatabaseName + ">的數據失敗!");
- MessageBox.Show("清空元數據庫<" + strDatabaseName + ">的數據失敗!");
- return;
- }
- }
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "清空元數據庫<" + strDatabaseName + ">的數據成功!");
- MessageBox.Show("清空元數據庫<" + strDatabaseName + ">的數據成功!");
- /*
- foreach (DataTable dt in nds.Tables)
- {
- string strTableName = strDatabaseName + "_" + dt.TableName;
- sql = "select * from " + strTableName;
- DataSet ds = new DataSet();
- OracleDataAdapter oda = new OracleDataAdapter(sql,
- ConfigurationSettings.AppSettings["ConnectionString"]);
- try
- {
- oda.Fill(ds);
- oda.Update(dt);
- }
- catch (Exception ex)
- {
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "清空元數據庫<" + strDatabaseName + ">的數據失敗!");
- MessageBox.Show("清空元數據庫<" + strDatabaseName + ">的數據失敗!");
- }
- }
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "清空元數據庫<" + strDatabaseName + ">的數據成功!");
- MessageBox.Show("清空元數據庫<" + strDatabaseName + ">的數據成功!");
- * */
- }
清空元數據庫與刪除元數據庫是不同的功能,刪除元數據庫就是把存放元數據的庫都一起刪除了,但是清空元數據庫只是把庫裏面的內容刪除,庫本身存在。
4.創建元數據庫
這是比較複雜的一個功能,因爲創建一個元數據庫需要根據一定的標準來創建,這些標準都是通過xsd文件描述的,所以首先要解析這個xml的模式描述文件,然後根據解析的內容存放到相應的字段中去,具體實現如下:
- private void createBtn_Click(object sender, EventArgs e)
- {
- SqlHelper sh = new SqlHelper();
- string sql = string.Empty;
- if (databaseIDTxt.Text.Trim() == "" || databaseNameTxt.Text.Trim() == "")
- {
- errTxt.Text = "數據庫ID或名稱不能爲空.";
- return;
- }
- //查看元數據庫是否存在
- sql = "select * from jcsjk_databaseinfo where name='" + databaseNameTxt.Text + "'";
- if (sh.GetRecordCount(sql) > 0)
- {
- MessageBox.Show("此元數據庫已經存在,請從新命名元數據庫!");
- return;
- }
- Hashtable ht = new Hashtable();
- string strContent = string.Empty;
- DataSet ds = new DataSet();
- //從文件標準創建
- if (!checkBoxX1.Checked)
- {
- if (metaFileTxt.Text == "" || Path.GetExtension(metaFileTxt.Text).ToLower() != ".xsd")
- {
- errTxt.Text = "請選擇正確的XSD文件.";
- return;
- }
- if (metaIDTxt.Text.Trim() == "")
- {
- errTxt.Text = "元數據標準ID不能爲空.";
- return;
- }
- //1.讀入xsd文件
- ds.ReadXmlSchema(metaFileTxt.Text);
- //2.create table in tablespace
- try
- {
- OracleDataSchemaAdapter odsa = new OracleDataSchemaAdapter();
- odsa.Create(ds, true, databaseNameTxt.Text + "_", "SDE");
- }
- catch (ArgumentException ae)
- {
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "創建元數據庫<" + databaseNameTxt.Text + ">失敗!");
- MessageBox.Show("-- Error --" + ae.Message + "-- Instructions --");
- }
- catch (FileNotFoundException)
- {
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "創建元數據庫<" + databaseNameTxt.Text + ">失敗!");
- MessageBox.Show("File not found: " + metaFileTxt.Text);
- }
- catch (Exception)
- {
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "創建元數據庫<" + databaseNameTxt.Text + ">失敗!");
- MessageBox.Show("創建元數據庫<" + databaseNameTxt.Text + ">失敗!");
- }
- //寫入元數據標準到數據庫
- StreamReader sr = new StreamReader(new FileStream(metaFileTxt.Text, FileMode.Open),
- System.Text.Encoding.GetEncoding("GB2312"));
- while (!sr.EndOfStream)
- {
- strContent += sr.ReadLine();
- }
- sr.Close();
- string strName = Path.GetFileNameWithoutExtension(metaFileTxt.Text);
- //
- sql = "select * from jcsjk_databaseinfo where name='" + strName + "'";
- if (sh.GetRecordCount(sql) <= 0)
- {
- XmlDocument xmlDoc = new XmlDocument();
- xmlDoc.Load(metaFileTxt.Text);
- XmlNodeList xnl = xmlDoc.GetElementsByTagName("xs:schema");
- XmlNode xn = xnl[0];
- //插入元數據標準到數據庫中,用參數才能插入,因爲content字段內容太大
- sql = "insert into jcsjk_metastand (id, name, content, org, version) values("
- + ":id,:name,:content,:org,:version)";
- OracleParameter[] op = new OracleParameter[5];
- op[0] = new OracleParameter();
- op[0].ParameterName = "id";
- op[0].OracleType = OracleType.NVarChar;
- op[0].Value = metaIDTxt.Text;
- op[1] = new OracleParameter();
- op[1].ParameterName = "name";
- op[1].OracleType = OracleType.NVarChar;
- string strValue = xn.ChildNodes[0].ChildNodes[1].InnerText;
- strValue = strValue.Substring(strValue.IndexOf(':') + 1);
- op[1].Value = strValue;
- op[2] = new OracleParameter();
- op[2].ParameterName = "content";
- op[2].OracleType = OracleType.Clob;
- op[2].Value = strContent;
- strValue = xn.ChildNodes[0].ChildNodes[2].InnerText;
- strValue = strValue.Substring(strValue.IndexOf(':') + 1);
- op[3] = new OracleParameter();
- op[3].ParameterName = "org";
- op[3].OracleType = OracleType.NVarChar;
- op[3].Value = strValue;
- strValue = xn.ChildNodes[0].ChildNodes[0].InnerText;
- strValue = strValue.Substring(strValue.IndexOf(':') + 1);
- op[4] = new OracleParameter();
- op[4].ParameterName = "version";
- op[4].OracleType = OracleType.NVarChar;
- op[4].Value = strValue;
- try
- {
- sh.ExecuteNonQuery(sql, op);
- }
- catch (Exception ex)
- {
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "寫入元數據標準<" + strName + ">到數據庫失敗!");
- MessageBox.Show("寫入元數據標準<<" + strName + ">到數據庫失敗!");
- }
- }
- }
- //從數據庫以存儲的標準創建
- else
- {
- string strStandName = comboBoxEx1.SelectedItem.ToString();
- sql = "select content from jcsjk_metastand where name='" + strStandName + "'";
- OracleDataReader odr = sh.ReturnDataReader(sql);
- if (odr.Read())
- {
- StreamWriter bw = new StreamWriter(new FileStream("temp.xsd", FileMode.Create),
- System.Text.Encoding.GetEncoding("GB2312"));
- bw.Write(odr[0].ToString());
- bw.Close();
- ds.ReadXmlSchema("temp.xsd");
- System.IO.File.Delete("temp.xsd");
- try
- {
- OracleDataSchemaAdapter odsa = new OracleDataSchemaAdapter();
- odsa.Create(ds, true, databaseNameTxt.Text + "_", "SDE");
- }
- catch (ArgumentException ae)
- {
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "創建元數據庫<" + databaseNameTxt.Text + ">失敗!");
- MessageBox.Show("-- Error --" + ae.Message + "-- Instructions --");
- }
- catch (FileNotFoundException)
- {
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "創建元數據庫<" + databaseNameTxt.Text + ">失敗!");
- MessageBox.Show("File not found: " + metaFileTxt.Text);
- }
- catch (Exception)
- {
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "創建元數據庫<" + databaseNameTxt.Text + ">失敗!");
- MessageBox.Show("創建元數據庫<" + databaseNameTxt.Text + ">失敗!");
- }
- }
- }
- //插入元數據庫信息到數據庫
- sql = "select * from jcsjk_databaseinfo where name='" + databaseNameTxt.Text + "'";
- if (sh.GetRecordCount(sql) <= 0)
- {
- ht.Clear();
- ht.Add("ID", databaseIDTxt.Text);
- ht.Add("NAME", databaseNameTxt.Text);
- if (descriptionText.Text != "")
- {
- ht.Add("DESCRIPTION", descriptionText.Text);
- }
- try
- {
- sh.Insert("jcsjk_databaseinfo", ht);
- }
- catch (Exception)
- {
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "插入元數據庫<" + databaseNameTxt.Text + ">信息到數據庫失敗!");
- MessageBox.Show("插入元數據庫<<" + databaseNameTxt.Text + ">信息到數據庫失敗!");
- }
- }
- LogHelp.writeLog(FrmMain.metaUsername, "元數據庫管理",
- "創建元數據庫<" + databaseNameTxt.Text + ">成功!");
- MessageBox.Show("創建元數據庫<" + databaseNameTxt.Text + ">成功!");
- Close();
- }
到此元數據庫的管理基本內容已經介紹完畢。