前言
之前讨论过这个话题,具体参见C#模板文件比对,但只讨论了上传文件与模板文件的字段名称
是否能够对应,而没有讨论二者关于字段类型、字段长度的对比。此次,将在前文的基础之上,重点讨论字段的类型和长度是否能够匹配。
辅助知识
DataTable 里可以获取列的集合DataColumnCollection,遍历即可得到每一个字段的名称。 但不能得到字段类型和长度。
思路
回顾最初的目的:对比上传文件与模板是否能够对应(匹配
)。
此处的匹配
,指的是完全一样,即字段个数,字段名称,字段类型,字段长度。
那么问题便转换成了如何获取模板文件和上传文件的字段名称
,字段类型
和字段长度
。
解决办法
1.字段名称的获取
字段名称的获取,可以通过将模板文件和上传文件转换成相同的格式(此处是DataTable
)来获取。
常见的模板格式是DBF
和EXCEL
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;
}
网友评论