基於ArcGIS10.0和Oracle10g的空間數據管理平臺十四(C#開發)-元數據庫庫管理

由於前段時間工作很忙而且出差去了北京一個多月,所以很久沒有介紹了關於基於ArcGIS10.0和Oracle10g的空間數據管理平臺這個項目的相關功能實現了,今天開始介紹一個新的功能實現,就是元數據庫的管理。

    所謂元數據就是描述數據的數據,元數據庫就是存放描述數據的數據。元數據主要用於描述數據的特徵等的數據,在很多場合下都會遇到元數據,例如文件系統裏面有。這裏介紹的元數據主要是指描述空間數據特徵的元數據,例如屬於哪一類數據等。

    今天由於時間關係就簡單介紹一下元數據庫管理的實現。

1.初始化顯示元數據庫信息的頭部信息

 

[csharp] view plaincopy
  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.刪除元數據庫

[csharp] view plaincopy
  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.  }  


 

3.清空元數據庫

[csharp] view plaincopy
  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的模式描述文件,然後根據解析的內容存放到相應的字段中去,具體實現如下:

[csharp] view plaincopy
  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. }  


    到此元數據庫的管理基本內容已經介紹完畢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章