注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

快乐小屋

 
 
 

日志

 
 

基于ArcGIS10.0和Oracle10g的空间数据管理平台十四(C#开发)-元数据库库管理  

2013-06-14 15:23:14|  分类: Oracle |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

    由于前段时间工作很忙而且出差去了北京一个多月,所以很久没有介绍了关于基于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.  }  


 

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. }  


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

  评论这张
 
阅读(223)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018