c# - 使用参数化连接时是否需要关闭连接

标签 c# sql-server sqlconnection

我有一段代码如下所示,我在其中打开连接并在其上执行命令。我是否必须关闭此连接或者编写这段代码的最佳方法是什么?

SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());

if (con.State == ConnectionState.Closed)
{
    con.Open();
}

string sql = "INSERT INTO RegisterUser(Name,LastName,email,Nationality,Country) VALUES (@param1,@param2,@param3,@param4,@param5)";

SqlCommand cmd = new SqlCommand(sql, con);

cmd.Parameters.Add("@param1", SqlDbType.NVarChar, 200).Value = txtName.Text;
cmd.Parameters.Add("@param2", SqlDbType.NVarChar, 100).Value = txtLastName.Text;
cmd.Parameters.Add("@param3", SqlDbType.NVarChar, 50).Value = txtEmail.Text;
cmd.Parameters.Add("@param4", SqlDbType.NVarChar, 50).Value = ddCountry.SelectedItem.Value.ToString();
cmd.Parameters.Add("@param5", SqlDbType.NVarChar, 50).Value = txtCountryCode.Text;

cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();

如果需要关闭连接,上面的代码不会释放内存吗?

最佳答案

是的,您需要始终关闭连接。而且你不需要第一个 if。

using(SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ToString()))
{

    con.Open();

    string sql = "INSERT INTO RegisterUser(Name,LastName,email,Nationality,Country) VALUES (@param1,@param2,@param3,@param4,@param5)";

    SqlCommand cmd = new SqlCommand(sql, con);
    cmd.Parameters.Add("@param1", SqlDbType.NVarChar, 200).Value = txtName.Text;
    cmd.Parameters.Add("@param2", SqlDbType.NVarChar, 100).Value = txtLastName.Text;
    cmd.Parameters.Add("@param3", SqlDbType.NVarChar, 50).Value = txtEmail.Text;
    cmd.Parameters.Add("@param4", SqlDbType.NVarChar, 50).Value = ddCountry.SelectedItem.Value.ToString();
    cmd.Parameters.Add("@param5", SqlDbType.NVarChar, 50).Value = txtCountryCode.Text;

    cmd.CommandType = CommandType.Text;
    cmd.ExecuteNonQuery();
}

因此,using 会自动为您关闭连接。即使您的代码抛出异常,也会发生这种情况。 using 代表 try/catch/finally block 。这样,如果发生错误,您可以保证连接返回到连接池

try
{
    Sqlconnection conn = new SqlConnection("your conn string");
}
catch(Exception ex)
{
    throw;
}
finally
{
    conn.Close();
}

关于c# - 使用参数化连接时是否需要关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40957264/

相关文章:

c# - 在不同的线程上连接到数据库

c# - "The model backing the ' DataContext ' context has changed"但我正在进行相同的迁移

c# - 在 MongoDb 中更新插入字典

asp.net - 不允许更改 'ConnectionString' 属性。连接当前状态为打开

sql - 检查 NULL 或 0

sql-server - 如何改进大表的读取操作?

c# - 更改 SqlConnection 字符串并在运行时调用 SqlConnectionStringBuilder

c# - 尝试使用正则表达式获取 URL 的最后一部分

c# - 尽管未调用complete(),TransactionScope 仍不回滚

sql-server - 必须声明表变量 "@myTable"