zoukankan      html  css  js  c++  java
  • 基于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 }

     

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

  • 相关阅读:
    C++ 练习02 魔术师发牌问题
    C++ 入门2 类型转换
    C++ 入门1 C++简介
    一个简单计算器的实现
    C++练习01 打印杨辉三角
    数据结构01数据结构基础01
    Lesson_7 作业_1 Driver 和 Car
    Caterl Java寒假基础练习题(一) 循环相加
    Lesson_9 上课笔记 多态
    Lesson_10 作业计算工资
  • 原文地址:https://www.cnblogs.com/brucewoo/p/2334082.html
Copyright © 2011-2022 走看看