示例#1
0
        //检测图层属性完整性 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
        }