DBFJava服务器端编程工具癖

C# 模板文件比对——增强版

2017-03-12  本文已影响0人  新手村的0级玩家
对比过程

前言

之前讨论过这个话题,具体参见C#模板文件比对,但只讨论了上传文件与模板文件的字段名称是否能够对应,而没有讨论二者关于字段类型、字段长度的对比。此次,将在前文的基础之上,重点讨论字段的类型和长度是否能够匹配。

辅助知识

DataTable 里可以获取列的集合DataColumnCollection,遍历即可得到每一个字段的名称。 但不能得到字段类型和长度。

思路

回顾最初的目的:对比上传文件与模板是否能够对应(匹配)。

此处的匹配,指的是完全一样,即字段个数,字段名称,字段类型,字段长度。

那么问题便转换成了如何获取模板文件和上传文件的字段名称字段类型字段长度

解决办法

1.字段名称的获取

字段名称的获取,可以通过将模板文件和上传文件转换成相同的格式(此处是DataTable)来获取。

常见的模板格式是DBFEXCEL

DBF文件的解析与封装参见C#封装DBF文件到DataTable

EXCEL文件的解析与封装参见C#封装EXCEL文件到DataTable

2.字段类型和长度获取

原始文件(模板上传文件

3.实现流程

通过将其转换成DataTable,进而获取二者字段名的集合。以字段名为依据,对比相应的字段类型和长度。

以DBF文件为例,实现对比模板文件的精确对比


        public static Boolean IsSameFormat(string initName, string testName)
        {

            DataColumnCollection initDCC = DbfToDataTable(initName).Columns;
            DataColumnCollection testDCC = null;
            //1.判断内容是否为DBF文件
            try
            {
                testDCC = DbfToDataTable(testName).Columns;
            }
            catch (Exception)
            {
                return false;
            }
            //2.判断列的个数是否相同
            if (initDCC.Count != testDCC.Count)
            {//列的个数不相同,直接报错
                return false;
            }
            DbfFile dbf = new DbfFile(Encoding.Default);
            dbf.Open(initName, FileMode.OpenOrCreate);
            DbfHeader initHeader = dbf.Header;

            dbf.Open(testName, FileMode.OpenOrCreate);
            DbfHeader testHeader = dbf.Header;
            dbf.Close();
            //3.判断列名是否相同
            for (int i = 0; i < initDCC.Count; i++)
            {
                DataColumn initDTC = initDCC[i];
                if (testDCC.Contains(initDTC.ColumnName))//1.判断列名
                {
                    //4.在列名相同的基础上,判断类型长度是否相同
                    DbfColumn ininDbfC = initHeader[initDTC.ColumnName];
                    DbfColumn testDbfC = testHeader[initDTC.ColumnName];
                    if ((ininDbfC.ColumnType == testDbfC.ColumnType) && (ininDbfC.Length == testDbfC.Length) && (ininDbfC.DecimalCount == testDbfC.DecimalCount))
                    {
                        continue;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
            return true;
        }


上一篇下一篇

猜你喜欢

热点阅读