//检测图层属性完整性 ygc 2012-8-30 private void CheckFields(IWorkspace TemplateWorkspace, IWorkspace TestWorkspace) { bool flag = true; Dictionary <string, List <string> > pFieldDic = ModDBOperator.GetFieldsListOfWorkSpace(TemplateWorkspace); IEnumDataset pEnumDataset = TestWorkspace.get_Datasets(esriDatasetType.esriDTFeatureClass); IEnumDataset pEnumTempDataset = TemplateWorkspace.get_Datasets(esriDatasetType.esriDTFeatureClass); pEnumDataset.Reset(); pEnumTempDataset.Reset(); IDataset pDataset = pEnumDataset.Next(); IDataset pTempDataset = pEnumTempDataset.Next(); Dictionary <string, List <string> > pMoreDic = new Dictionary <string, List <string> >(); Dictionary <string, List <string> > pLessDic = new Dictionary <string, List <string> >(); Dictionary <string, List <string> > pDifDic = new Dictionary <string, List <string> >(); string strResult = ""; while (pTempDataset != null) { while (pDataset != null) { if (pFieldDic.ContainsKey(pDataset.Name)) { List <string> pTmpList = pFieldDic[pDataset.Name]; List <string> pMoreList = null; List <string> pDifList = new List <string>(); IFeatureClass pFeatureClass = pDataset as IFeatureClass; IFeatureClass pTempFeatureClass = pTempDataset as IFeatureClass; IFields pFields = pFeatureClass.Fields; IFields pTempFields = pTempFeatureClass.Fields; for (int i = 0; i < pFields.FieldCount; i++) { string temp = CheckField(pFields.get_Field(i), pTempFields, pFeatureClass.AliasName); if (temp != null && temp != "") { flag = false; pDifList.Add(temp); } } if (pDifList.Count > 0) { pDifDic.Add(pFeatureClass.AliasName, pDifList); } for (int f = 0; f < pFields.FieldCount; f++) { IField pField = pFields.get_Field(f); if (pField.Type != esriFieldType.esriFieldTypeOID && pField.Type != esriFieldType.esriFieldTypeGeometry) { if (pTmpList.Contains(pField.Name)) { pTmpList.Remove(pField.Name); } else { if (pMoreList == null) { pMoreList = new List <string>(); } pMoreList.Add(pField.Name); } } } if (pTmpList.Count > 1) { pLessDic.Add(pDataset.Name, pTmpList); } if (pMoreList != null) { pMoreDic.Add(pDataset.Name, pMoreList); } } pDataset = pEnumDataset.Next(); } pTempDataset = pEnumTempDataset.Next(); } pEnumDataset = TestWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset); pEnumTempDataset = TemplateWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset); pEnumDataset.Reset(); pEnumTempDataset.Reset(); IFeatureDataset pFeaDataset = pEnumDataset.Next() as IFeatureDataset; IFeatureDataset pTempFeaDataset = pEnumTempDataset.Next() as IFeatureDataset; while (pTempFeaDataset != null) { while (pFeaDataset != null) { IFeatureClassContainer pFeatureClassContainer = pFeaDataset as IFeatureClassContainer; IEnumFeatureClass pEnumFeatureClass = pFeatureClassContainer.Classes; IFeatureClass pEnFeatureClass = pEnumFeatureClass.Next(); IFeatureClassContainer pTemplateFeatureClassContainer = pTempFeaDataset as IFeatureClassContainer; IEnumFeatureClass pTemplateFeatureClass = pTemplateFeatureClassContainer.Classes; IFeatureClass pTempEnFeatureClass = pTemplateFeatureClass.Next(); while (pTempEnFeatureClass != null) { IDataset pTemplateDateset = pTempEnFeatureClass as IDataset; IFeatureClass pTempFeatureClass = pTemplateDateset as IFeatureClass; IFields pTemplateFields = pTempFeatureClass.Fields; while (pEnFeatureClass != null) { IDataset pTmpDataset = pEnFeatureClass as IDataset; if (pFieldDic.ContainsKey(pTmpDataset.Name)) { List <string> pTmpList = pFieldDic[pTmpDataset.Name]; List <string> pMoreList = null; List <string> pDifList = new List <string>(); IFeatureClass pFeatureClass = pTmpDataset as IFeatureClass; IFields pFields = pFeatureClass.Fields; for (int i = 0; i < pFields.FieldCount; i++) { string temp = CheckField(pFields.get_Field(i), pTemplateFields, pFeatureClass.AliasName); if (temp != null && temp != "") { flag = false; pDifList.Add(temp); } } if (pDifList.Count > 0) { pDifDic.Add(pFeatureClass.AliasName, pDifList); } for (int f = 0; f < pFields.FieldCount; f++) { IField pField = pFields.get_Field(f); if (pField.Type != esriFieldType.esriFieldTypeOID && pField.Type != esriFieldType.esriFieldTypeGeometry) { if (pTmpList.Contains(pField.Name)) { pTmpList.Remove(pField.Name); } else { if (pMoreList == null) { pMoreList = new List <string>(); } pMoreList.Add(pField.Name); } } } if (pTmpList.Count > 1) { pLessDic.Add(pTmpDataset.Name, pTmpList); } if (pMoreList != null) { pMoreDic.Add(pTmpDataset.Name, pMoreList); } } pEnFeatureClass = pEnumFeatureClass.Next(); } pTempEnFeatureClass = pTemplateFeatureClass.Next(); } pFeaDataset = pEnumDataset.Next() as IFeatureDataset; } pTempFeaDataset = pEnumTempDataset.Next() as IFeatureDataset; } #region 写错误日志 if (pDifDic.Count > 0) { strResult += "以下属性列不同:\r\n"; } foreach (string strkey in pDifDic.Keys) { strResult += strkey + "图层:\r\n"; List <string> pTempList = pDifDic[strkey]; for (int i = 0; i < pTempList.Count; i++) { strResult += pTempList[i]; } strResult += "\r\n"; pTempList.Clear(); } if (pLessDic.Count > 0) { strResult += "缺少以下属性列:\r\n"; flag = false; } foreach (string strkey in pLessDic.Keys) { strResult = strResult + strkey + "图层:\r\n"; List <string> pTmpList0 = pLessDic[strkey]; for (int l = 0; l < pTmpList0.Count; l++) { strResult = strResult + " " + pTmpList0[l] + ",\r\n"; } strResult += "\r\n"; pTmpList0.Clear(); } if (pMoreDic.Count > 0) { strResult = strResult + "多余以下属性列:\r\n"; flag = false; } foreach (string strkey in pMoreDic.Keys) { strResult = strResult + strkey + "图层:\r\n"; List <string> pTmpList0 = pMoreDic[strkey]; for (int l = 0; l < pTmpList0.Count; l++) { strResult = strResult + " " + pTmpList0[l] + ",\r\n"; } strResult += "\r\n"; pTmpList0.Clear(); } pLessDic.Clear(); pMoreDic.Clear(); if (flag) { MessageBox.Show("通过检查", "提示"); } else { DialogResult result = MessageBox.Show("检查未通过,是否查看日志文件?", "提示", MessageBoxButtons.OKCancel); WriteLog(strResult); if (result == DialogResult.OK) { System.Diagnostics.Process.Start("notepad.exe", _LogFilePath); } } #endregion }