2017-12-11 16 views
0

こんにちはみんな、私はtblInvoiceItemsTempテーブルからすべてのレコードを取得し、tblInvoiceItemsテーブル内のすべてのレコードを保存しようとしているが、解決することができないのです。助けていただければ幸いです。ありがとうございます。どのように一つのテーブルからすべてのレコードを取得し、リサイズでのC#で別のテーブルの上にそれを保存するには?

btnSave_Click()イベントで次のコードを追加しました。

string connetionString1 = "server=localhost;database=billingDB;uid=root;pwd=root;integrated security=true"; 
using (MySqlConnection cnn1 = new MySqlConnection(connetionString1)) 
{ 
    cnn1.Open(); 
    string load_temp_table_rec_qry = "SELECT * FROM tblInvoiceItemsTemp"; 
    using (MySqlCommand sqlcmd = new MySqlCommand(load_temp_table_rec_qry, cnn1)) 
    { 
     MySqlDataReader temp_reader = sqlcmd.ExecuteReader(); 
     while (temp_reader.Read()) 
     { 
      string insert_invoice_items_qry = "INSERT INTO tblInvoiceItems(invoiceID, particulars, qty, rate) VALUES('" + 12 + "', '" + temp_reader["particulars"] + "', '" + temp_reader["qty"] + "', '" + temp_reader["rate"] + "')"; 
      using (MySqlCommand itemsCmd = new MySqlCommand(insert_invoice_items_qry, cnn1)) 
      { 
       itemsCmd.ExecuteNonQuery(); 
      } 
     } 
    } 
    cnn1.Close(); 
} 

私は、次のエラーメッセージを取得しています。

An unhandled exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll 
Additional Information: There is already an open DataReader associated with this Connection which must be closed first. 
+0

は、接続を閉じる前に、DataReaderを閉じて(temp_reader.Close())。私はこれが問題かもしれないと思う。 –

+0

本当にありがとうございました@VickyS – Beginner

答えて

1

エラーメッセージは非常に明確である:あなたが開いているDataReaderを(あなたがClose/Disposeと呼ばれていない)持っている一方で、接続は何か他のもののために使用することはできません。

using (MySqlCommand sqlcmd = new MySqlCommand(load_temp_table_rec_qry, cnn1)) 
{ 
    MySqlDataReader temp_reader = sqlcmd.ExecuteReader(); 
    using (var secondConnection = new MySqlConnection(connetionString1)) 
    { 
     secondConnection.Open(); 
     while (temp_reader.Read()) 
     { 
      string insert_invoice_items_qry = "INSERT INTO tblInvoiceItems(invoiceID, particulars, qty, rate) VALUES('" + 12 + "', '" + temp_reader["particulars"] + "', '" + temp_reader["qty"] + "', '" + temp_reader["rate"] + "')"; 
      using (MySqlCommand itemsCmd = new MySqlCommand(insert_invoice_items_qry, secondConnection)) 
      { 
       itemsCmd.ExecuteNonQuery(); 
      } 
     } 
    } 
} 

もう一つの方法は、非接続モデルを使用して接続がitemsCmdのために使用するための自由であるように、MySqlDataAdapterを使用してDataTableにレコードをロードすることです。これを行う1つの方法は、2番目の接続を開くことです。
しかし、あなたはより良いパフォーマンスを得るため、INSERT INTO SELECTを行うことができ、このためにメモリにすべてのレコードをダウンロードする必要はありません。

INSERT INTO tblInvoiceItems(invoiceID, particulars, qty, rate) 
SELECT 12, tblInvoiceItemsTemp.particulars, tblInvoiceItemsTemp.qty, tblInvoiceItemsTemp.rate 
FROM tblInvoiceItemsTemp 
+0

はどうもありがとう、私はこのソリューションを試してみましょう。 – Beginner

+0

15人の評判を待って、このソリューションをupvoteします。あなたは私の日を救ってくれました。心から感謝します。 – Beginner

+0

助けてうれしいです。ちょうど好奇心が強い、3つの提案のうちのどれに行ったのですか?あなたはそれがより良いアプローチであることを特徴とするよう –

関連する問題