2013-03-12 71 views
0

我需要从一组表和SQLBulkInsert的攫取大量数据到另一组......不幸的是,源表都为varchar(max)和我想的目标是正确的类型。有些表格在数百万行中......并且(由于太多没有意义的政策原因)我们不能使用SSIS。除此之外,一些“bool”值被存储为“Y/N”,一些“0/1”,一些“T/F”一些“真/假”以及最后一些“开/关” 。是否有可能从IDataReader对SQLBulkUpload进行数据类型转换?

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

另一种(也许是最好的解决办法)是把一个映射到位(也许AutoMapper或自定义),并使用EF从一个对象加载和映射到其他?这将provoide很多的控制,但也需要大量的每个属性的样板代码:(

+0

BTW:顺便说一句 - 有什么理由不同时使用的SqlConnection /交易及EF在大致相同的代码?例如对于某些情况,只需调用SQLCommand即可,而对于其他情况则使用EF模型? – BlueChippy 2013-03-12 06:20:09

+1

我有一个类似的问题 - 看看这里的答案,它帮助我http://stackoverflow.com/q/4750653/532498 – Pleun 2013-03-12 21:29:03

回答

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 OK ,所以只需要很小的维护费用,但是由于源列很少会发生变化s并不影响任何事情。

相关问题