Мне нужно захватить большое количество данных из одного набора таблиц и SQLBulkInsert в другой набор ... к сожалению, исходные таблицы - это ВСЕ varchar (max), и я хотел бы, чтобы назначение было правильным типом. Некоторые таблицы находятся в миллионах строк ... и (по слишком бессмысленным причинам, связанным с политикой) мы не можем использовать SSIS.
Кроме того, некоторые значения «bool» хранятся как «Y / N», некоторые «0/1», некоторые «T / F» - некоторые «истинные / ложные» и, наконец, некоторые «вкл / выкл».
Есть ли способ перегрузить IDataReader для преобразования типов? Думаю, нужно было бы на одной колонке?
Альтернативой (и может быть лучшим решением) является установка картографа на место (возможно, AutoMapper или обычай) и использование EF для загрузки с одного объекта и на карту в другую? Это будет провоцировать большой контроль, но также требует большого количества шаблонов для каждого свойства :(
В конце я написал базовый класс-оболочку для хранения 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. Хорошо, поэтому есть небольшие накладные расходы на обслуживание, но поскольку исходные столбцы очень редко меняются, это ни на что не влияет.