Как получить все записи из одной таблицы и сохранить ее в другой таблице с помощью C # в winforms?

0

Привет, ребята, я пытаюсь получить все записи из таблицы 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.
Теги:
ado.net

1 ответ

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();
            }
        }
    }
}

Другой способ - использовать отключенную модель и загрузить записи в DataTable с помощью MySqlDataAdapter, чтобы соединение было бесплатным для itemsCmd.
Однако вам не нужно загружать в память все записи для этого, вы можете сделать INSERT INTO SELECT, для большей производительности:

INSERT INTO tblInvoiceItems(invoiceID, particulars, qty, rate)
SELECT 12, tblInvoiceItemsTemp.particulars, tblInvoiceItemsTemp.qty, tblInvoiceItemsTemp.rate
FROM tblInvoiceItemsTemp
  • 0
    Большое спасибо, позвольте мне попробовать это решение.
  • 0
    Ожидание 15 репутаций, чтобы поддержать это решение. Вы спасли мой день, сердечное спасибо.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню