1

問題がある。一部のデータを含む古いデータベースがあり、別の側には新しい構造の新しいデータベースがあります。

今、あるテーブルから別のテーブルにデータをコピーする最良の方法 (アイデア) が必要です。問題は、一部のテーブルに最大 1000 のレコードがあり、32 000 から 640 000 まであり、5000 以上をコピーする時間が非常に長いことです。

ベストプラクティスはありますか? 以下のサンプルコード...

public ActionResult ImportTable1()
{
   var oldTable1 = context.OLDTABLE.ToList();

   foreach (var item in oldTable1)
   {
      try
      {
          var cTable = contextNew.NEWTABLE.Where(p => p.fiel1 == item.field1).FirstOrDefault();

          if (cTable == null)
          {
             NEWTABLE nTable = new NEWTABLE
             {
                                field1 = item.field1,
                                field2 = item.field2
             };

             contextNew.NEWTABLE.Add(nTable);
          }
          else
          {
             cTable.field1 = item.field1
             cTable.field2 = item.field2;

             contextNew.Entry(cTable).State = EntityState.Modified;
          }

          IcontextNew.SaveChanges();
      }
      catch (DbEntityValidationException dbEx)
      {
         foreach (var validationErrors in dbEx.EntityValidationErrors)
         {
            foreach (var validationError in validationErrors.ValidationErrors)
            {
               _progresLog = ("Property: " + validationError.PropertyName + " Error: {1}" + validationError.ErrorMessage);
            }
         }
     }

   return PartialView();
}

...とてもかさばる

    public void ExperimentalPartsBulk()
    {
        string msisDatabase = ConfigurationManager.ConnectionStrings["old"].ToString();
        string newDatabase = ConfigurationManager.ConnectionStrings["new"].ToString();

        SqlConnection sourceconnection = new SqlConnection(msisDatabase);
        SqlConnection sourcedestination = new SqlConnection(newDatabase);


        sourceconnection.Open();
        SqlCommand cmd = new SqlCommand("Select * from ELEMENTS");
        cmd.Connection = sourceconnection;
        SqlDataReader reader = cmd.ExecuteReader();

        //Connect to Destination DataBase
        SqlConnection destinationConnection = new SqlConnection(newDatabase);
        destinationConnection.Open();


        SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection);
        bulkCopy.DestinationTableName = "ELEMENTSNEW";
        bulkCopy.ColumnMappings.Clear();
        bulkCopy.ColumnMappings.Add("fielString1", "newString1");
        bulkCopy.ColumnMappings.Add("fielString2", "newStrin2");
        bulkCopy.ColumnMappings.Add("fielFloat1", "newINT1");
        bulkCopy.WriteToServer(reader);
        reader.Close();

        sourceconnection.Close();
        sourcedestination.Close();

    }

問題は今、2つのテーブル間のwの違いです

fieldString1は null にすることができますが、newString1は | にすることはできません。fielFloat1はフロートになり、null 可能になりましたが、 newINT1はできません

いくつかの条件で、または異なるタイプのフィールドにインポートする方法は?

4

2 に答える 2

0

SSIS または bcp を真剣に検討する必要があります。それ以外の場合は、ソース サーバーから .net コードが実行されているクライアント ボックスまでデータをプルし、そのデータをすべて宛先サーバーにプッシュするというシナリオを見ています。消費される帯域幅を考えてみてください。代わりに、宛先への SSIS エクスポートを行うことができれば、少なくとも余分な懸念が解消されます。

絶対にクライアントにデータをプルする必要がある場合は、データを bcp 形式のファイルに書き込んでから、それらを宛先サーバーに一括コピーすることを検討してください。

これらのパスは両方とも、単純な古い ADO.NET のようなアプローチを使用するよりもはるかに高速であることがわかると確信しています。

于 2013-05-19T15:02:51.407 に答える
0

シウェク、

最初のコードサンプルに示されているループは、パフォーマンスの問題により失敗します....あなたが指摘したように!

ここでの正しいアプローチは SQL アプローチです。アイデアは、すべてのデータを新しい DB に「フラッシュ」することです。フラッシュとは、1 回のアクションですべてのレコード (5,000 または 500,000) が新しい DB に格納されることを意味します。また、データの抽出、フィルタリング、編集、および保存中のループは避けてください。640,000 のループには時間がかかるためです....

一括コピーが可能です。一括コピーの問題は、このオブジェクトのデータをフィルター処理して編集するのが難しいことです。

ADO.net DataSet を使用して、古い DB からデータを取得し、フィルター処理して編集し、メモリに保存して新しい DB にフラッシュします。DataSet はアクションごとに 1 つのステップを実行します (抽出、フィルタリング、編集など。ループなし)。

または、SQL レプリケーションを試してください。レプリケーションとは、DB「A」のテーブル「oneTable」から別のDB「B」のテーブル「AnotherTable」にスキーマとルールが異なるデータをコピーするSQLの仕組みです。それを試してみてください。それがあなたにとって合理的な解決策であると思われる場合は、さらに指定できます。コードは必要ありません。SQL Management Studio のウィザードを使用して作成し、必要に応じて (SQL ジョブ エージェントを介して) 実行できます。

于 2013-05-19T14:44:28.250 に答える