Можно ли выполнить преобразование типа данных в SQLBulkUpload из IDataReader?

Мне нужно получить большой объем данных из одного набора таблиц и SQLBulkInsert в другой набор... к сожалению, исходные таблицы ВСЕ varchar (max), и я хотел бы, чтобы назначение было правильного типа. Некоторые таблицы состоят из миллионов строк... и (по слишком бессмысленным политическим причинам, чтобы вдаваться в них) мы не можем использовать SSIS.

Кроме того, некоторые «логические» значения сохраняются как «Y/N», некоторые «0/1», некоторые «T/F», некоторые «true/false» и, наконец, некоторые «on/off».

Есть ли способ перегрузить IDataReader для выполнения преобразования типов? Я думаю, должно быть для каждого столбца?

Альтернативой (и может быть лучшим решением) является установка картографа (возможно, AutoMapper или пользовательского) и использование EF для загрузки из одного объекта и сопоставления с другим? Это обеспечило бы большой контроль, но также потребовало бы большого количества стандартного кода для каждого свойства :(


person BlueChippy    schedule 12.03.2013    source источник
comment
Кстати: в стороне - есть ли причина НЕ использовать SqlConnection/Transaction и EF в одном и том же общем коде? например Для некоторых вещей проще просто вызвать SQLCommand, а для других использовать модель EF?   -  person BlueChippy    schedule 12.03.2013
comment
У меня была похожая проблема - посмотри ответ здесь, мне помогло stackoverflow.com/q/4750653/532498   -  person Pleun    schedule 13.03.2013


Ответы (1)


В конце концов я написал базовый класс-оболочку для хранения 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. Итак, есть небольшие накладные расходы на обслуживание, но поскольку исходные столбцы меняются очень редко, это на самом деле ни на что не влияет.

person BlueChippy    schedule 13.03.2013