C# 在数据库中插入记录时,连接必须有效且打开

C# 在数据库中插入记录时,连接必须有效且打开,c#,asp.net,C#,Asp.net,我正在尝试将客户端详细信息插入数据库,但遇到此异常 连接必须有效且打开。在MySql.Data.MySqlClient.MySqlCommand.Throw(异常ex)在MySql.Data.MySqlClient.MySqlCommand.CheckState()在MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(命令行为)在MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()在MySql.Da

我正在尝试将客户端详细信息插入数据库,但遇到此异常

连接必须有效且打开。在MySql.Data.MySqlClient.MySqlCommand.Throw(异常ex)在MySql.Data.MySqlClient.MySqlCommand.CheckState()在MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(命令行为)在MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()在MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()在book_online.saveClient_点击(对象发送方,事件参数)


您没有为命令指定连接对象:

cmd.Connection = con;
此外,最好使用
using
块,该块在退出该块时自动关闭连接:

using(MySqlConnection con = new MySqlConnection())
{
   con.ConnectionString =
                       ConfigurationManager.ConnectionStrings("conio").ConnectionString();

   MySqlCommand cmd = new MySqlCommand();
   cmd.CommandText = @"INSERT INTO clientsDetails
              (clientName, companyAddress, city, contactPersonName, contactNumber1)
               Values
              (@clientName, @companyAddress, @city, @contactPersonName, @contactNumber1)";

   cmd.Connection = con;
   cmd.Parameters.AddWithValue("@clientName", companyName.Text);
   cmd.Parameters.AddWithValue("@companyAddress", companyAddress.Text);
   cmd.Parameters.AddWithValue("@city", companyCity.Text);
   cmd.Parameters.AddWithValue("@contactPersonName", concernPersonName.Text);
   cmd.Parameters.AddWithValue("@contactNumber1", countryCodeWithNumber);
   con.Open();
   cmd.ExecuteNonQuery();
}

仅供参考,
using
关键字允许编译为封闭块生成一个
try…finally
,并使用
中的对象调用
Dispose
con
)在生成的finally块中。因此,在保证finally的所有情况下,您的连接都将被关闭)

您已经打开了连接并执行了命令,但是您忘记了将连接分配给命令,那么只有代码可以正常工作。强烈建议您也使用。然后代码将如下所示:

using (MySqlConnection con = new MySqlConnection())
{
    con.ConnectionString = ConfigurationManager.ConnectionStrings("conio").ConnectionString();
    string queryText = "INSERT INTO clientsDetails (clientName, companyAddress, city, contactPersonName, contactNumber1) Values(@clientName, @companyAddress, @city, @contactPersonName, @contactNumber1)";
    using (MySqlCommand cmd = new MySqlCommand(queryText, con))
    {
        cmd.Parameters.AddWithValue("@clientName", companyName.Text);
        cmd.Parameters.AddWithValue("@companyAddress", companyAddress.Text);
        cmd.Parameters.AddWithValue("@city", companyCity.Text);
        cmd.Parameters.AddWithValue("@contactPersonName", concernPersonName.Text);
        cmd.Parameters.AddWithValue("@contactNumber1", countryCodeWithNumber);
        con.Open();
        cmd.ExecuteNonQuery();
    }
}

命令缺少连接字符串。

MySqlConnection con = new MySqlConnection();
con.ConnectionString = ConfigurationManager.ConnectionStrings("conio").ConnectionString();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = con;
cmd.CommandText = "INSERT INTO clientsDetails (clientName, companyAddress, city, contactPersonName, contactNumber1) Values(@clientName, @companyAddress, @city, @contactPersonName, @contactNumber1)";
cmd.Parameters.AddWithValue("@clientName", companyName.Text);
cmd.Parameters.AddWithValue("@companyAddress", companyAddress.Text);
cmd.Parameters.AddWithValue("@city", companyCity.Text);
cmd.Parameters.AddWithValue("@contactPersonName", concernPersonName.Text);
cmd.Parameters.AddWithValue("@contactNumber1", countryCodeWithNumber);
con.Open();
cmd.ExecuteNonQuery();
con.Close();

你确定你的连接字符串是正确的吗?@Divinemaic肯定是100%正确你的命令与任何连接都没有关联。只需为命令使用适当的构造函数来传递连接实例。@Dennis,因为它不是必需的。如果你不这样做,那没有坏处。它只是强制该对象的终结器,与SQL连接或未管理的资源无关。这对于连接也不是强制性的。那么,为什么您建议对连接使用
using
忽略了这个事实,即该命令也使用未管理的资源呢?@Dennis处理连接会关闭该SQL连接。处理SQL命令会关闭什么?它只是处理对象并将其标记为垃圾收集。@user3185569:您没有为命令指定连接对象:,连接不是命令的对象,而是命令的属性。@un lucky Com'n!属性只是一个为命令使用的连接对象设置(或获取)引用的方法。让我们不要把事情复杂化,这段代码不会编译,因为行:MySqlCommand cmd=newmysqlcommand(con);由于“MySql.Data.MySqlClient.MySqlCommand.MySqlCommand(string)”的最佳重载方法匹配具有一些无效参数,因此

MySqlConnection con = new MySqlConnection();
con.ConnectionString = ConfigurationManager.ConnectionStrings("conio").ConnectionString();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = con;
cmd.CommandText = "INSERT INTO clientsDetails (clientName, companyAddress, city, contactPersonName, contactNumber1) Values(@clientName, @companyAddress, @city, @contactPersonName, @contactNumber1)";
cmd.Parameters.AddWithValue("@clientName", companyName.Text);
cmd.Parameters.AddWithValue("@companyAddress", companyAddress.Text);
cmd.Parameters.AddWithValue("@city", companyCity.Text);
cmd.Parameters.AddWithValue("@contactPersonName", concernPersonName.Text);
cmd.Parameters.AddWithValue("@contactNumber1", countryCodeWithNumber);
con.Open();
cmd.ExecuteNonQuery();
con.Close();