c# - 如何在winforms中用C#获取一个表中的所有记录并将其保存到另一个表中?

标签 c# mysql sql ado.net

大家好,我正在尝试从 tblInvoiceItemsTemp 表中获取所有记录并将所有记录保存在 tblInvoiceItems 表中,但无法解决。任何帮助将不胜感激,谢谢。

我在 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.

最佳答案

错误消息非常清楚:当您打开 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();
            }
        }
    }
}

另一种方法是使用断开连接的模型,并使用 MySqlDataAdapter 将记录加载到 DataTable,这样连接就可以免费用于 itemsCmd
但是,您不需要为此将所有记录下载到内存中,您可以执行 INSERT INTO SELECT 以获得更好的性能:

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

关于c# - 如何在winforms中用C#获取一个表中的所有记录并将其保存到另一个表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47749863/

相关文章:

c# - 您可以使用不使用剪贴板的 Excel Interop 一次粘贴一个单元格 block 吗?

c# - 如何使用 async/await 实现命令模式

mysql - 使用 mySQL,如何在多个不同的表中按日期排序?

MySQL 到 PostgreSQL 的 to_tsvector、@@ 和 to_tsquery?

c# - 扩展方法解析

c# - asp.net 中的 Response.Write()

php - 为联合学说 2 集合实现 setter/getter

mysql - 计算与 MySQL 中每个唯一 ID 的前一行的日期差异

python - 使用 pyodbc 从 Linux 到 Windows SQL Server 进行身份验证

mysql - 有趣的 mysql 5.6 行为