Esempio n. 1
0
        public static List <string> CheckLayer(LayerArgs lyrArgs, DicInfoReader dicInfo)
        {
            List <string> rlts      = new List <string>();
            TxLayerInfo   txLyrInfo = dicInfo.TxLyrList.First(t => t.DataLayer == lyrArgs.DataLayer); //t.TxName == lyrArgs.TxName && t.TjName == lyrArgs.TjName && t.LayerName == lyrArgs.LayerName && t.DataLayer == lyrArgs.DataLayer);
            //List<LayerAttInfo> attInfoList = dicInfo.LyrAttList.Where(t => t.TxName == txLyrInfo.TxName).Where(t => t.TjName == txLyrInfo.TjName).Where(t => t.LayerName == txLyrInfo.LayerName).ToList();
            List <LayerAttInfo> attInfoList = dicInfo.LyrAttList.Where(t => t.DataLayer == txLyrInfo.DataLayer).ToList();
            DataTable           tbl         = ShpUtility.GetRecords(lyrArgs.LayerPath, null);

            // 检查列名是否有特殊字符
            for (int i = 0; i < tbl.Columns.Count; i++)
            {
                if (tbl.Columns[i].ColumnName.IndexOf('?') != -1)
                {
                    string info = string.Format("数据检查:列名长度不符合ArcGIS规范:{0}", tbl.Columns[i].ColumnName);
                    rlts.Add(info);
                }
            }

            //检查字段及名称是否齐全
            List <string> logs = CheckFiledNums(tbl, attInfoList);

            if (logs != null && logs.Count > 0)
            {
                rlts.AddRange(logs);
            }
            //检查字段值是否溢出(超过限定长度或不在给定阈值范围)
            logs = CheckFiledValueRange(tbl, attInfoList);
            if (logs != null && logs.Count > 0)
            {
                rlts.AddRange(logs);
            }
            //检查字段字典项
            for (int i = 0; i < attInfoList.Count; i++)
            {
                LayerAttInfo lyrAtt = attInfoList[i];
                logs = CheckDicAtt(tbl, lyrAtt, dicInfo);
                if (logs != null && logs.Count > 0)
                {
                    rlts.AddRange(logs);
                }
            }
            return(rlts);
        }
Esempio n. 2
0
        //检查字段字典项
        private static List <string> CheckDicAtt(DataTable tbl, LayerAttInfo attInfo, DicInfoReader dicInfo)
        {
            List <string>       rlts       = new List <string>();
            List <AttValueInfo> attValList = dicInfo.AttValueList.Where(t => t.AttId == attInfo.Guid).ToList();

            if (attValList == null || attValList.Count < 1)
            {
                return(rlts);
            }
            List <string> cols = new List <string>();

            for (int i = 0; i < tbl.Columns.Count; i++)
            {
                cols.Add(tbl.Columns[i].ColumnName);
            }
            if (attValList.Count == 1 && string.IsNullOrEmpty(attValList[0].ParentId) == false)
            {
                AttValueInfo attVal = attValList[0];
                //检查大类是符合字典项
                AttValueInfo  pAttVal  = dicInfo.AttValueList.First(t => t.Guid == attVal.ParentId);
                LayerAttInfo  pAttInfo = dicInfo.LyrAttList.First(t => t.Guid == pAttVal.AttId);
                List <string> infoList = CheckDicAtt(tbl, pAttInfo, dicInfo);
                if (infoList != null && infoList.Count > 0)
                {
                    rlts.AddRange(infoList.ToArray());
                }
            }
            //检查是否符合字典项
            List <string> valueList = GetDicValues(attValList);

            for (int i = 0; i < tbl.Rows.Count; i++)
            {
                object obj = null;
                if (cols.Contains(attInfo.DataName))
                {
                    obj = tbl.Rows[i][attInfo.DataName];
                }
                if (obj == null)
                {
                    continue;
                }
                string valStr = obj.ToString();
                if (attInfo.Constraint.Equals("M", StringComparison.CurrentCultureIgnoreCase) && valueList.Contains(valStr) == false)
                {
                    string info = string.Format("数据检查:第{0}行“{1}”字段值不在字典项({2})里", i, attInfo.DataName, JoinStr(valueList));
                    rlts.Add(info);
                }
                else if (attInfo.Constraint.Equals("O", StringComparison.CurrentCultureIgnoreCase))
                {
                    //有待完善
                    bool ok = false;
                    for (int j = 0; j < valueList.Count; j++)
                    {
                        if (valStr.Contains(valueList[j]))
                        {
                            ok = true;
                        }
                    }
                    if (ok == false)
                    {
                        string info = string.Format("数据检查:第{0}行{1}字段值不在字典项({2})里", i, attInfo.DataName, JoinStr(valueList));
                        rlts.Add(info);
                    }
                }
            }
            return(rlts);
        }