我的任务是将大量数据从旧的,随机的,摇摇欲坠的系统迁移到现代的系统。这项工作的一部分是将旧数据映射到与新数据库的强类型匹配的导入文件,因为旧数据库即使只有整数,也有很多varchar
列。多年来使用情况也发生了变化,因此每种数据类型的列都可能包含空值。
该项目的必要组成部分是通过C#程序优化所有内容以生成导入文件。该程序需要将Convert
列添加到与调用数据层的对象的属性相匹配的新数据类型(通过反射进行处理),但是如果遇到DbNull
则失败。它可以是任何列,每个DataTable
最多可以轻松包含120列。
我尝试将.Net null
值存储在其位置,但这引发了我无法存储 null
的错误。 em>,只需DbNull
。有没有更好的选择呢?我基本上只需要一个类似DataTable
的结构即可接受null
作为列值。我试图避免为存储此数据的对象修改每个构造函数,因为要自己使用每个对象要花费几周的编程时间。仅使用兼容的数据源是更可取的。
为了说明,这是数据访问库中的代码(出于明显的原因而无法运行):
private static DataTable Clean(DataTable dt)
{
foreach(DataRow r in dt.Rows)
for ( int i = 0; i<= r.ItemArray.Count(); i++) //(object i in r.ItemArray)
{
r[i] = Convert.IsDBNull(r[i]) ? null : r[i];
}
return dt;
}
您无法为数据表中的列值分配null
。但是我什至会尝试的原因是因为在调用库的程序中有几百个地方(每个类构造器最多120个)这样的代码:
p.DateOfHire = Convert.ToDateTime(r["started_on"]);
我正在尝试使数据在分配之前可消化。我认为我可能需要的是一个功能非常类似于DataTable的集合,因此它可以具有以相同方式调用的值。
编辑2:我正在考虑something like this:
public static T ConvertFromDBVal<T>(object obj)
{
if (obj == null || obj == DBNull.Value)
{
return default(T); // returns the default value for the type
}
else
{
return (T)obj;
}
}
但是当我生成要导入到新系统的文件时,无法使用默认的.Net值填充字段。