2017-11-30 14 views
0

Windowsフォームアプリケーションがあります。私はいくつかのデータ操作のためにMS Accessデータベースを使用しています。あるデータベースから別のデータベースにデータをコピーしたい。テーブル名、スキーマ、およびデータ型は、両方のテーブルで同じです。MSアクセスデータベースで一括挿入が機能しない場合に選択

私は、ソースデータベースからデータを選択することによって、以下のクエリを使用して宛先データベースにデータを一括挿入しています。

INSERT INTO [Table1] IN 'C:\Data\Users.mdf' SELECT * FROM [Table1] 

データが挿入された後、私は挿入されたデータをフェッチするためにターゲットテーブルにクエリしています。私はデータベース操作を実行するためにOleDbConnectionを使用しています。

ここで私が直面している問題は、データを取得するためにSELECT文を実行しているときに上記のINSERTクエリを実行した後にデータが取得されないということです。しかし、私がデバッグモードをチェックしているときに、データを取得しています。

私は、INSERT文が実行されてからしばらく待っていると、データが正しく来ていることに気付きました。だから、私は一括挿入操作を完了するために、ある時間(遅延?)が必要であると仮定します。

私はTask.Delay(20000)をINSERTクエリの実行後に提供してみましたが、運がありませんでした。誰かが私にここで助けてもらえますか?この問題をどう解決できますか?どんな助けも高く評価されます。

+0

どのくらいのデータについて話していますか?そして、テーブルを開いて見て、データが適切に入っていることを確認しましたか?おそらく、ソーステーブルをターゲットデータベースにインポートして、適切に書き直されたクエリを実行するだけです。次に、2つの別々のデータベース間の通信で発生する可能性のある問題を少なくとも排除します。 –

+0

約7 lakhレコードがあります。しかし、私はこの問題を10レコードで再現することができます。 INSERT操作が行われる前に、ソースデータベースとターゲットデータベースの両方に対してデータベース接続が開きます。 –

+0

私は全体の手順を投稿することをお勧めします。 –

答えて

0

私はこれを処理する良い方法は見つけられませんでしたが、同じことを回避しました。データがテーブルに挿入された後、挿入されたテーブルにデータがあるかどうかを確認する別のクエリが実行されます。これは次のようにdo..whileループで発生します。操作が完了するたびにテーブルが削除されます。

 var insertQuery = "INSERT INTO [Table1] IN 'C:\Data\Users.mdf' SELECT * FROM [Table1]"; 
     ExecuteQuery(insertQuery, connProd); 

     var count = 10; 

     do 
     { 
      var selectQuery = "SELECT TOP 1 * FROM " + tableProdCopy; 
      var dtTopRowData = GetQueryData(selectQuery, connOther); 

      if (dtTopRowData != null && dtTopRowData.Rows.Count > 0) 
      { 
       count = 0; 
       break; 
      } 

      System.Threading.Thread.Sleep(2000); 

      count = count - 1; 
     } while (count > 0); 


     private DataTable GetQueryData(string query, OleDbConnection conn) 
     { 
      using (OleDbCommand cmdOutput = new OleDbCommand(query, conn)) 
      { 
       using (OleDbDataAdapter adapterOutput = new OleDbDataAdapter(cmdOutput)) 
       { 
        var dtOutput = new DataTable(); 

        adapterOutput.Fill(dtOutput); 

        return dtOutput; 
       } 
      } 
     } 



     private void ExecuteQuery(string query, OleDbConnection conn) 
     { 
      using (OleDbCommand cmdInput = new OleDbCommand(query, conn)) 
      { 
       cmdInput.ExecuteNonQuery(); 
      } 
     } 
関連する問題