【问题标题】:'ExecuteNonQuery requires an open and available Connection. The connection's current state is closed.' - C#'ExecuteNonQuery 需要一个开放且可用的连接。连接的当前状态是关闭的。 - C#
【发布时间】:2022-01-12 10:44:47
【问题描述】:

代码:

        private void btnSave_Click(object sender, EventArgs e)
        {
            
            using (con = new SqlConnection(connectionString))
            {
                SqlCommand cmd;
                switch (action)
                {
                    case 'a':
                        cmd = new SqlCommand("INSERT INTO tbl_User (userName, userPass) Values (@username, @userpass)", con);
                        cmd.CommandType = CommandType.Text;
                        cmd.Parameters.AddWithValue("@username", txtUN.Text.Trim());
                        cmd.Parameters.AddWithValue("@userpass", txtPW.Text.Trim());
                        cmd.ExecuteNonQuery();
                        cmd.Connection.Close();

                        MessageBox.Show("Added new User Successfully!", "User Maintenance", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        break;
                    case 'u':
                        break;
                    case 'd':
                        break;
                }
            }
            LoadData();
        }

单击保存按钮时出现此错误:

System.InvalidOperationException: 'ExecuteNonQuery 需要打开 和可用的连接。连接的当前状态为关闭。'

我正在使用using 关键字,如果我是正确的,using 不会自动打开和关闭 sqlConnection?如果是这样,为什么它会返回一个错误,即我需要为ExecuteNonQuery() 建立一个开放且可用的连接?我怎样才能解决这个问题?我应该只是简单地添加 Open 和 Close 语法吗?还是有更好的方法来做到这一点

LoadData() 方法:

public void LoadData()
        {
            //keyword using automatically closes the connection to the sql
            using (con = new SqlConnection(connectionString))
            {
                SqlDataAdapter sda = new SqlDataAdapter("Select * from tbl_User", con);
                DataTable dt = new DataTable();
                sda.Fill(dt);

                DGUserData.DataSource = dt;
            }
        }

【问题讨论】:

  • 不,使用不会打开连接。从 using 块退出 disposes 连接,在 Dispose 方法中,连接会自行关闭,但连接不会自动打开
  • cmd.Connection.Open() 不是在哪里?
  • using 负责清理(关闭),但您必须明确打开。
  • 是或者创建一个返回打开的连接的方法,并在using里面的assignement中使用它
  • SqlDataAdapter 会在连接关闭时自动打开连接(或者使用 Fill 方法更好)

标签: c# sql using sqlconnection executenonquery


【解决方案1】:

您可以简单地使用 con.Open() 以便在关闭状态下建立连接,或者您可以在打开连接之前添加检查(下面的 sn-p)。

public void LoadData()
        {
            //keyword using automatically closes the connection to the sql
            using (con = new SqlConnection(connectionString))
            {
                  if (con.State == ConnectionState.Closed)
                  con.Open();

                SqlDataAdapter sda = new SqlDataAdapter("Select * from tbl_User", con);
                DataTable dt = new DataTable();
                sda.Fill(dt);
                DGUserData.DataSource = dt;
            }
        }

【讨论】:

    猜你喜欢
    • 2012-12-26
    • 2011-04-02
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    相关资源
    最近更新 更多