连接必须有效且打开

oknwwptz  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(360)

我正在用c#(visualstudio2017)和mysql数据库构建一个配置表单。我想在数据库中存储文件夹路径。我得到一个“连接必须有效并打开”错误,但当我注解掉“cmd2.executenonquery();”我不明白这个错误。如果你能告诉我我做错了什么,我真的很感激。如果你能给我一个代码的例子,这将是伟大的。这是我的密码:

private void button5_Click(object sender, EventArgs e)
    { 

        ConnectionStringSettings conSettings = ConfigurationManager.ConnectionStrings["shopmanagerConnectionString1"];
        MySqlConnection con = new MySqlConnection(conSettings.ToString());

        string a = textBox1.Text;
        string b = textBox2.Text;
        string c = textBox4.Text;
        string escapedPath = a.Replace(@"\", @"\\").Replace("'", @"\'");
        string escapedPath1 = b.Replace(@"\", @"\\").Replace("'", @"\'");
        string escapedPath2 = c.Replace(@"\", @"\\").Replace("'", @"\'");
        MySqlCommand cmd2 = new MySqlCommand("update shopmanager.paths set path_to_clients = '" + escapedPath + "',path_to_employee = '" + escapedPath1 + "',path_to_procedures = '" + escapedPath2 + "';");

        try
        {
            con.Open();
            cmd2.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        con.Close();

    }
bybem2ql

bybem2ql1#

当你发表评论的时候 cmd2.ExecuteNonQuery(); 什么都没有发生,所以不太可能出错;-)
连接必须有效且打开
此错误表示没有绑定到命令的打开连接对象。尽管您打开了连接,但从未将其分配给命令(不同的命令可能有不同的连接)。
所以;您需要将连接分配给命令:

cmd2.Connection = con;

或者,更常见的情况是,在构造命令时:

MySqlCommand cmd2 = new MySqlCommand("your sql goes here", con);
1szpjjfi

1szpjjfi2#

连接必须有效并且open始终表示 MySqlCommand 未关联到任何活动连接 ExecuteNonQuery() 方法执行或正确 MySqlConnection 示例从未提供给相应的命令,即使连接已经打开。
因此,最好设置 UPDATE 以便于阅读:

using (MySqlConnection con = new MySqlConnection(conSettings.ToString()))
{
    using (MySqlCommand cmd2 = new MySqlCommand(@"update shopmanager.paths 
    set path_to_clients = @escapedPath, path_to_employee = @escapedPath1,
    path_to_procedures = @escapedPath2 where ...", con))
    {
        cmd2.Parameters.AddWithValue("@escapedPath", a.Replace(@"\", @"\\").Replace("'", @"\'"));
        cmd2.Parameters.AddWithValue("@escapedPath1", b.Replace(@"\", @"\\").Replace("'", @"\'"););
        cmd2.Parameters.AddWithValue("@escapedPath2", c.Replace(@"\", @"\\").Replace("'", @"\'"));

        try
        {
            con.Open();
            cmd2.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}

或设置 CommandText 以及 Connection 属性(也包括参数,完全避免连接值):

using (MySqlConnection con = new MySqlConnection(conSettings.ToString()))
{
    using (MySqlCommand cmd2 = new MySqlCommand())
    {
        cmd2.Connection = con;
        cmd2.CommandText = "update shopmanager.paths set path_to_clients = @escapedPath, path_to_employee = @escapedPath1, path_to_procedures = @escapedPath2 where ...";
        cmd2.Parameters.AddWithValue("@escapedPath", a.Replace(@"\", @"\\").Replace("'", @"\'"));
        cmd2.Parameters.AddWithValue("@escapedPath1", b.Replace(@"\", @"\\").Replace("'", @"\'"););
        cmd2.Parameters.AddWithValue("@escapedPath2", c.Replace(@"\", @"\\").Replace("'", @"\'"));

        try
        {
            con.Open();
            cmd2.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}

请注意 using 语句可用于在成功更新后立即释放连接对象。

相关问题