基於ArcGIS10.0和Oracle10g的空間數據管理平臺十一(C#開發)-空間數據字段檢查

  最近在北京出差一直沒有時間繼續寫博客,主要是晚上上網的條件不好,而且和幾個同事住在一起也不太方便寫博客,因爲隨時我們都可能聊天交流!今晚還是決定繼續寫一遍比較簡單的博客,就是繼續寫ArcGIS的項目,今天主要介紹的內容就是關於空間數據完整性、格式等地檢查!

1.首先定義一個用於操作的SDE空間數據庫的工作空間。

[csharp] view plaincopy
  1. public IFeatureWorkspace pWorkspaceSDE;//SDE數據庫的工作空間  

2.加載需要檢查的MDB數據庫文件。

[csharp] view plaincopy
  1. //設置默認DBM文件爲第一個,並加載它的表到DataGridView  
  2. filenameComboBox.SelectedIndex = 0;  
  3. AddDataToDataGridView(filenameComboBox.SelectedItem.ToString());  

    第一次加載時默認解析第一個MDB文件裏面的數據表,並且把這些表的信息加載到控件中顯示。加載對應MDB文件的數據表信息的函數如下所示:

[csharp] view plaincopy
  1. /// <summary>  
  2. /// 將DBM文件中的表加載到DataGridView中  
  3. /// </summary>  
  4. /// <param name="filename"></param>  
  5. private void AddDataToDataGridView(string filename)  
  6. {  
  7.     dataGridViewX1.Rows.Clear();  
  8.     //打開mdb文件所在的工作空間  
  9.     IWorkspaceFactory wf = new AccessWorkspaceFactory();  
  10.     IFeatureWorkspace pFeatureWorkspaceMDB = wf.OpenFromFile(filename, 0) as IFeatureWorkspace;  
  11.     IWorkspace pWorkspaceMDB = pFeatureWorkspaceMDB as IWorkspace;  
  12.   
  13.     //1.遍歷mdb的每一個要素集  
  14.     IEnumDataset enumDataset = pWorkspaceMDB.get_Datasets(esriDatasetType.esriDTFeatureDataset);  
  15.     IFeatureDataset featureDs = enumDataset.Next() as IFeatureDataset;  
  16.     object[] obj = new object[2];  
  17.     while (featureDs != null)  
  18.     {  
  19.         IFeatureClass pFeatureClass;  
  20.         IFeatureClassContainer fcContainer = featureDs as IFeatureClassContainer;  
  21.         for (int i = 0; i < fcContainer.ClassCount; i++)  
  22.         {  
  23.             pFeatureClass = fcContainer.get_Class(i);  
  24.             obj[0] = CheckFields(pFeatureClass.Fields, pFeatureClass.AliasName);  
  25.             obj[1] = pFeatureClass.AliasName;  
  26.               
  27.             dataGridViewX1.Rows.Add(obj);  
  28.         }  
  29.   
  30.         featureDs = enumDataset.Next() as IFeatureDataset;  
  31.     }  
  32.   
  33.     //2.遍歷mdb的每一個獨立要素類  
  34.     enumDataset = pWorkspaceMDB.get_Datasets(esriDatasetType.esriDTFeatureClass);  
  35.     IDataset dataset = enumDataset.Next();  
  36.       
  37.     while (dataset != null)  
  38.     {  
  39.         IFeatureClass pFeatureClass = dataset as IFeatureClass;  
  40.   
  41.         obj[0] = CheckFields(pFeatureClass.Fields, pFeatureClass.AliasName);  
  42.         obj[1] = pFeatureClass.AliasName;  
  43.   
  44.         dataGridViewX1.Rows.Add(obj);  
  45.         dataset = enumDataset.Next();  
  46.     }  
  47.   
  48.     //3.遍歷mdb的每一個屬性表  
  49.     enumDataset = pWorkspaceMDB.get_Datasets(esriDatasetType.esriDTTable);  
  50.     dataset = enumDataset.Next();  
  51.   
  52.     while (dataset != null)  
  53.     {  
  54.         ITable pT = dataset as ITable;  
  55.   
  56.         obj[0] = CheckFields(pT.Fields, dataset.Name);  
  57.         obj[1] = dataset.Name;  
  58.   
  59.         dataGridViewX1.Rows.Add(obj);  
  60.         dataset = enumDataset.Next();  
  61.     }  
  62. }  

 

3.動態增加MDB文件到ComboBox,在打開檢查字段的界面以前可以先添加需要檢查的文件。

[csharp] view plaincopy
  1. /// <summary>  
  2. /// 增加文件名到ComboBox中  
  3. /// </summary>  
  4. /// <param name="filename">文件名</param>  
  5. public void AddDataToComboBox(string filename)  
  6. {  
  7.     filenameComboBox.Items.Add(filename);  
  8. }  

4.查字段是否符合數據標準定義,所有數據結構都是預先定義好了的並且存在數據庫中作爲數據字典管理。

[csharp] view plaincopy
  1. /// <summary>  
  2. /// 檢查字段是否符合數據標準定義  
  3. /// </summary>  
  4. /// <param name="pSourceFileds">字段集</param>  
  5. /// <param name="strTableName">對應的標準名</param>  
  6. /// <returns>true:成功;false:失敗</returns>  
  7. private bool CheckFields(IFields pSourceFileds, string strTableName)  
  8. {  
  9.     SqlHelper sh = new SqlHelper();  
  10.     //從數據庫定義標準表中查找出字段的定義  
  11.     string sql = "select * from jcsjk_fielddefine where table_name ='"  
  12.         + strTableName.ToUpper() + "' or table_name='" + strTableName.ToLower() + "'";  
  13.     //如果字段數目不同肯定就不能通過檢查了  
  14.     if (pSourceFileds.FieldCount != sh.GetRecordCount(sql))  
  15.     {  
  16.         return false;  
  17.     }  
  18.     bool result = true;  
  19.   
  20.     OracleDataReader odr = sh.ReturnDataReader(sql);  
  21.     object[] obj1 = new object[4];  
  22.     object[] obj2 = new object[4];  
  23.     //分別檢查字段名稱,字段類型,字段長度和字段是否可以爲空  
  24.     for (int i = 0; i < pSourceFileds.FieldCount; i++)  
  25.     {  
  26.         odr.Read();  
  27.         //根據標準中定義的名稱查找檢查的字段名稱  
  28.         if (pSourceFileds.FindField(odr["NAME"].ToString()) >= 0)  
  29.         {  
  30.             IField pSourceField = pSourceFileds.get_Field(pSourceFileds.FindField(odr["NAME"].ToString()));  
  31.   
  32.             obj1[0] = pSourceField.Name;  
  33.             obj1[1] = pSourceField.Type;  
  34.             obj1[2] = pSourceField.Length;  
  35.             obj1[3] = pSourceField.IsNullable;  
  36.   
  37.             obj2[0] = odr["NAME"].ToString();  
  38.             if (odr["TYPE"].ToString() == "RowID")  
  39.             {  
  40.                 obj2[1] = esriFieldType.esriFieldTypeOID;  
  41.             }  
  42.             else if (odr["type"].ToString() == "整數型")  
  43.             {  
  44.                 obj2[1] = esriFieldType.esriFieldTypeInteger;  
  45.             }  
  46.             else if (odr["type"].ToString() == "浮點型")  
  47.             {  
  48.                 obj2[1] = esriFieldType.esriFieldTypeDouble;  
  49.             }  
  50.             else if (odr["type"].ToString() == "字符型")  
  51.             {  
  52.                 obj2[1] = esriFieldType.esriFieldTypeString;  
  53.             }  
  54.             else if (odr["type"].ToString() == "圖元")  
  55.             {  
  56.                 obj2[1] = esriFieldType.esriFieldTypeGeometry;  
  57.             }  
  58.             obj2[2] = odr["LENGTH"].ToString();  
  59.             if (odr["ISNULL"].ToString() == "是")  
  60.             {  
  61.                 obj2[3] = true;  
  62.             }  
  63.             else  
  64.             {  
  65.                 obj2[3] = false;  
  66.             }  
  67.   
  68.             if (obj1[1].ToString() != obj2[1].ToString()  
  69.                 || obj1[2].ToString() != obj2[2].ToString()  
  70.                 || obj1[3].ToString() != obj2[3].ToString())  
  71.             {  
  72.                 result = false;  
  73.                 break;  
  74.             }  
  75.         }  
  76.         else  
  77.         {  
  78.             result = false;  
  79.             break;  
  80.         }  
  81.     }  
  82.     return result;  
  83. }  

5.點擊一個具體的表名之後在另一個控件中顯示這個表的字段的檢查結果,主要顯示這個是否成功,如果錯誤提示哪些方面的錯誤,例如字段數量不對(少了還是多了)、字段類型不對、數據的長度不匹配等。

[csharp] view plaincopy
  1. /// <summary>  
  2. /// 點擊一個具體的表名之後在另一個控件中顯示這個表的字段的檢查結果  
  3. /// </summary>  
  4. /// <param name="sender"></param>  
  5. /// <param name="e"></param>  
  6. private void dataGridViewX1_Click(object sender, EventArgs e)  
  7. {  
  8.     if (dataGridViewX1.CurrentRow == null)  
  9.     {  
  10.         return;  
  11.     }  
  12.     string strTableName = dataGridViewX1.CurrentRow.Cells[1].Value.ToString();  
  13.   
  14.     IWorkspaceFactory wf = new AccessWorkspaceFactory();  
  15.     IFeatureWorkspace pFeatureWorkspaceMDB = wf.OpenFromFile(filenameComboBox.SelectedItem.ToString(), 0) as IFeatureWorkspace;  
  16.     IWorkspace pWorkspaceMDB = pFeatureWorkspaceMDB as IWorkspace;  
  17.     //1.遍歷mdb的每一個要素集  
  18.     IEnumDataset enumDataset = pWorkspaceMDB.get_Datasets(esriDatasetType.esriDTFeatureDataset);  
  19.     IFeatureDataset featureDs = enumDataset.Next() as IFeatureDataset;  
  20.     IFields pFs = null;  
  21.       
  22.     while (featureDs != null)  
  23.     {  
  24.         IFeatureClass pFC = null;  
  25.         IFeatureClassContainer fcContainer = featureDs as IFeatureClassContainer;  
  26.         for (int i = 0; i < fcContainer.ClassCount; i++)  
  27.         {  
  28.             if (fcContainer.get_Class(i).AliasName.ToLower() == strTableName.ToLower())  
  29.             {  
  30.                 pFC = fcContainer.get_Class(i);  
  31.                 pFs = pFC.Fields;  
  32.                 break;  
  33.             }  
  34.         }  
  35.         featureDs = enumDataset.Next() as IFeatureDataset;  
  36.     }  
  37.     //2.遍歷mdb的每一個獨立要素類  
  38.     if (pFs == null)  
  39.     {  
  40.         IFeatureClass pFC = null;  
  41.         enumDataset = pWorkspaceMDB.get_Datasets(esriDatasetType.esriDTFeatureClass);  
  42.         IDataset dataset = enumDataset.Next();  
  43.         while (dataset != null)  
  44.         {  
  45.             pFC = dataset as IFeatureClass;  
  46.             if (pFC.AliasName.ToLower() == strTableName.ToLower())  
  47.             {  
  48.                 pFs = pFC.Fields;  
  49.                 break;  
  50.             }  
  51.             dataset = enumDataset.Next();  
  52.         }  
  53.     }  
  54.     //3.遍歷mdb的每一個屬性表  
  55.     if (pFs == null)  
  56.     {  
  57.         ITable tc = null;  
  58.         enumDataset = pWorkspaceMDB.get_Datasets(esriDatasetType.esriDTTable);  
  59.         IDataset dataset = enumDataset.Next();  
  60.         while (dataset != null)  
  61.         {  
  62.             tc = dataset as ITable;  
  63.             if (dataset.Name.ToLower() == strTableName.ToLower())  
  64.             {  
  65.                 pFs = tc.Fields;  
  66.                 break;  
  67.             }  
  68.             dataset = enumDataset.Next();  
  69.         }  
  70.     }  
  71.     SqlHelper sh = new SqlHelper();  
  72.     string sql = "select * from jcsjk_fielddefine where table_name ='"  
  73.         + strTableName.ToUpper() + "' or table_name='" + strTableName.ToLower() + "'";  
  74.   
  75.     if (sh.GetRecordCount(sql) <= 0)  
  76.     {  
  77.         errTxt.Text = "標準不存在,不能檢查!";  
  78.         return;  
  79.     }  
  80.     if (pFs.FieldCount != sh.GetRecordCount(sql))  
  81.     {  
  82.         errTxt.Text = "標準檢查未通過,字段數量不匹配!";  
  83.         return ;  
  84.     }  
  85.   
  86.     OracleDataReader odr = sh.ReturnDataReader(sql);  
  87.     int count = 0;  
  88.     object[] obj = new object[2];  
  89.     for (int i = 0; i < pFs.FieldCount; i++)  
  90.     {  
  91.         odr.Read();  
  92.         //字段是否存在  
  93.         if (pFs.FindField(odr["NAME"].ToString()) >= 0)  
  94.         {  
  95.             IField pSourceField = pFs.get_Field(pFs.FindField(odr["NAME"].ToString()));  
  96.   
  97.             //1.檢查字段類型  
  98.             if (odr["TYPE"].ToString() == "RowID")  
  99.             {  
  100.                 if (pSourceField.Type != esriFieldType.esriFieldTypeOID)  
  101.                 {  
  102.                     count++;  
  103.                     obj[0] = pSourceField.AliasName;  
  104.                     obj[1] = "字段類型錯誤";  
  105.                     dataGridViewX2.Rows.Add(obj);  
  106.                     continue;  
  107.                 }  
  108.             }  
  109.             else if (odr["type"].ToString() == "整數型")  
  110.             {  
  111.                 if (pSourceField.Type != esriFieldType.esriFieldTypeInteger)  
  112.                 {  
  113.                     count++;  
  114.                     obj[0] = pSourceField.AliasName;  
  115.                     obj[1] = "字段類型錯誤";  
  116.                     dataGridViewX2.Rows.Add(obj);  
  117.                     continue;  
  118.                 }  
  119.             }  
  120.             else if (odr["type"].ToString() == "浮點型")  
  121.             {  
  122.                 if (pSourceField.Type != esriFieldType.esriFieldTypeDouble)  
  123.                 {  
  124.                     count++;  
  125.                     obj[0] = pSourceField.AliasName;  
  126.                     obj[1] = "字段類型錯誤";  
  127.                     dataGridViewX2.Rows.Add(obj);  
  128.                     continue;  
  129.                 }   
  130.             }  
  131.             else if (odr["type"].ToString() == "字符型")  
  132.             {  
  133.                 if (pSourceField.Type != esriFieldType.esriFieldTypeString)  
  134.                 {  
  135.                     count++;  
  136.                     obj[0] = pSourceField.AliasName;  
  137.                     obj[1] = "字段類型錯誤";  
  138.                     dataGridViewX2.Rows.Add(obj);  
  139.                     continue;  
  140.                 }   
  141.             }  
  142.             else if (odr["type"].ToString() == "圖元")  
  143.             {  
  144.                 if (pSourceField.Type != esriFieldType.esriFieldTypeGeometry)  
  145.                 {  
  146.                     count++;  
  147.                     obj[0] = pSourceField.AliasName;  
  148.                     obj[1] = "字段類型錯誤";  
  149.                     dataGridViewX2.Rows.Add(obj);  
  150.                     continue;  
  151.                 }   
  152.             }  
  153.             //2.檢查字段長度  
  154.             if (pSourceField.Length != int.Parse(odr["LENGTH"].ToString()))  
  155.             {  
  156.                 count++;  
  157.                 obj[0] = pSourceField.AliasName;  
  158.                 obj[1] = "字段長度錯誤";  
  159.                 dataGridViewX2.Rows.Add(obj);  
  160.                 continue;  
  161.             }  
  162.             //3.檢查字段是否爲空  
  163.             if (odr["ISNULL"].ToString() == "是")  
  164.             {  
  165.                 if (pSourceField.IsNullable != true)  
  166.                 {  
  167.                     count++;  
  168.                     obj[0] = pSourceField.AliasName;  
  169.                     obj[1] = "字段爲空錯誤";  
  170.                     dataGridViewX2.Rows.Add(obj);  
  171.                 }  
  172.             }  
  173.             else  
  174.             {  
  175.                 if (pSourceField.IsNullable != false)  
  176.                 {  
  177.                     count++;  
  178.                     obj[0] = pSourceField.AliasName;  
  179.                     obj[1] = "字段爲空錯誤";  
  180.                     dataGridViewX2.Rows.Add(obj);  
  181.                 }  
  182.             }  
  183.         }  
  184.         else  
  185.         {  
  186.             errTxt.Text = "標準檢查未通過,沒有找到標準裏面的" + odr["NAME"].ToString() + "字段!";  
  187.             return;  
  188.         }  
  189.     }  
  190.     if (count > 0)  
  191.     {  
  192.         errTxt.Text = "標準檢查未通過,失敗字段數:" + count.ToString();  
  193.     }  
  194.     else  
  195.     {  
  196.         errTxt.Text = "標準檢查通過!";  
  197.     }  
  198. }  

6.總結:本篇只介紹了一個功能就是檢查對應的空間數據結構是否匹配,這是導入數據到數據庫中的必備步驟,不然可能造成數據庫的損壞,也浪費了一些不必要的操作。本篇的代碼中還有datagridView和combobox等控件的使用,例如怎樣在datagridview控件的固定單元增加值等。

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