连接必须是有效的,并且可以保存到MySql

本文关键字:保存 MySql 有效 连接 | 更新日期: 2023-09-27 18:13:15

我的同学说我有很多连接,但我试着删除和添加一些连接,但没有工作。我总是得到"连接必须是有效的和打开的"或"连接已经打开"answers"命令执行时遇到致命错误",我希望你们能帮助我。

这是我的保存部分,我把它放在transact_button上,所以在收银员计算项目后,信息必须在mysql数据库上,这样我就可以创建一个水晶报告。

        try
        {
        string id = products_lv.SelectedItems[0].Text;
        string name = products_lv.SelectedItems[0].SubItems[1].Text;
        string price = products_lv.SelectedItems[0].SubItems[2].Text;
        string qty = products_lv.SelectedItems[0].SubItems[4].Text;

            sql_connect.Close();
            sql_connect.Open();
            sql_command = new MySqlCommand("insert into transaction_cashier(orderid,productid,productname,price,quantity,total,vat,subitems,payment,change) values (@orderid,@produtid,@productname,@price,@quantity,@total,@vat,@subitems,@payment,@change)");
            sql_command.ExecuteReader();
            sql_connect.Close();
            sql_connect.Open();
            sql_command.Connection = sql_connect;
            sql_command.Parameters.AddWithValue("@orderid", id_num.Text);
            sql_command.Parameters.AddWithValue("@productid", id.ToString());
            sql_command.Parameters.AddWithValue("@productname", name.ToString());
            sql_command.Parameters.AddWithValue("@price", price.ToString());
            sql_command.Parameters.AddWithValue("@quantity", qty.ToString());
            sql_command.Parameters.AddWithValue("@vat", vat_txt.Text);
            sql_command.Parameters.AddWithValue("@subitems", subitems_txt.Text);
            sql_command.Parameters.AddWithValue("@payment", payment_txt.Text);
            sql_command.Parameters.AddWithValue("@change", change_txt.Text);
            sql_connect.Open();
            sql_command.ExecuteNonQuery();
            sql_connect.Close();
            MessageBox.Show("Saved");
        }
        catch (Exception ex)
        {
            MessageBox.Show("Transaction cashier error: " + ex.Message);
        }
    }

希望你们能帮助我,非常感谢。

连接必须是有效的,并且可以保存到MySql

您有一个打开的连接,但您从未将其与您的命令关联。该命令必须具有要执行的连接。创建命令时,必须将连接传递给构造函数,否则必须设置Connection属性。

你的代码是荒谬的。以下是事件的顺序:

  1. 创建连接
  2. 创建命令并将其与连接关联。
  3. 添加命令参数
  4. 打开连接
  5. 执行命令
  6. 关闭连接。

您应该使用using语句来创建连接,然后当它被处置时,它将在块的末尾自动关闭,例如

using (var connection = new MySqlConnection("connection string here"))
using (var command = new MySqlCommand("SQL code here", connection))
{
    command.Parameters.AddWithValue("@ParamName", paramValue);
    try
    {
        connection.Open();
        command.ExecuteNonQuery();
    }
    catch
    {
        // ...
    }
}