0

あるテーブル セットから大量のデータを取得し、SQLBulkInsert を別のセットに挿入する必要があります。いくつかのテーブルは何百万行にもなります...そして (あまりにも無意味な政治的理由から) SSIS を使用することはできません。

さらに、いくつかの "bool" 値は "Y/N"、いくつかの "0/1"、いくつかの "T/F"、いくつかの "true/false"、そして最後にいくつかの "on/off" として保存されます。

型変換を実行するために IDataReader をオーバーロードする方法はありますか? 私が推測する列ごとに必要でしょうか?

別の方法 (そして最良の解決策かもしれません) は、マッパー (おそらく AutoMapper またはカスタム) を配置し、EF を使用して 1 つのオブジェクトから読み込み、別のオブジェクトにマップすることです。これにより、多くの制御が可能になりますが、すべてのプロパティに対して多くの定型コードが必要になります:(

4

1 に答える 1

0

最後に、SQLDataReader を保持する基本ラッパー クラスを作成し、SQLDataReader メソッドを呼び出すためだけに IDataReader メソッドを実装しました。

次に、基本クラスから継承し、ケースごとに 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 に答える