是否可以从IDataReader对SQLBulkUpload进行数据类型转换?

时间:2013-03-12 06:00:26

标签: c#-4.0 mapping sqlbulkcopy

我需要从一组表和SQLBulkInsert中获取大量数据到另一组...不幸的是源表是ALL varchar(max),我希望目标是正确的类型。有些表格数百万行......(因为太过无意义的政治原因)我们不能使用SSIS。

除此之外,一些“bool”值存储为“Y / N”,一些“0/1”,一些“T / F”存储一些“真/假”,最后一些“开/关”。

有没有办法重载IDataReader来执行类型转换?我猜需要按列进行吗?

另一种选择(可能是最佳解决方案)是将映射器放置到位(可能是AutoMapper或自定义)并使用EF从一个对象加载并映射到另一个对象?这会带来很多控制,但每个属性也需要很多样板代码:(

1 个答案:

答案 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,效果很好,可扩展,而且速度非常快。好的,所以维护开销很小,但由于源列很少会发生变化,所以这并不会对任何事情产生任何影响。