我需要从一组表和SQLBulkInsert中获取大量数据到另一组...不幸的是源表是ALL varchar(max),我希望目标是正确的类型。有些表格数百万行......(因为太过无意义的政治原因)我们不能使用SSIS。
除此之外,一些“bool”值存储为“Y / N”,一些“0/1”,一些“T / F”存储一些“真/假”,最后一些“开/关”。
有没有办法重载IDataReader来执行类型转换?我猜需要按列进行吗?
另一种选择(可能是最佳解决方案)是将映射器放置到位(可能是AutoMapper或自定义)并使用EF从一个对象加载并映射到另一个对象?这会带来很多控制,但每个属性也需要很多样板代码:(
答案 0 :(得分:0)
最后,我写了一个基础包装类来保存SQLDataReader,并实现IDataReader方法只是为了调用SQLDataReader方法。
然后从基类继承并基于每个案例覆盖GetValue,查找需要翻译的列名:
public override object GetValue(int i)
{
var landingColumn = GetName(i);
string landingValue = base.GetValue(i).ToString();
object stagingValue = null;
switch (landingColumn)
{
case "D4DTE": stagingValue = landingValue.FromStringDate(); break;
case "D4BRAR": stagingValue = landingValue.ToDecimal(); break;
default:
stagingValue = landingValue;
break;
}
return stagingValue;
}
由于SQLBulkUpload,效果很好,可扩展,而且速度非常快。好的,所以维护开销很小,但由于源列很少会发生变化,所以这并不会对任何事情产生任何影响。