0

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

最重要的是,一些“布尔”值存储为“Y/N”,一些“0/1”,一些“T/F”,一些“真/假”,最后一些“开/关”。

有没有办法重载 IDataReader 来执行类型转换?我猜需要以每列为基础吗?

另一种选择(可能是最好的解决方案)是放置一个映射器(可能是 AutoMapper 或自定义)并使用 EF 从一个对象加载并映射到另一个对象?这将避免大量控制,但也需要为每个属性提供大量样板代码:(

4

1 回答 1

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,运行良好、可扩展且速度非常快。好的,所以维护开销很小,但是由于源列很少会更改,因此这不会真正影响任何事情。

于 2013-03-13T06:08:28.170 回答