【问题标题】:Do i need to close the connection when using parametrised connection [duplicate]使用参数化连接时是否需要关闭连接[重复]
【发布时间】:2016-12-04 18:35:01
【问题描述】:

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

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();

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

【问题讨论】:

  • 是的,或者您可以使用 using 语句 - 请参阅 linklink
  • 所以现在有 4 个人给了你完全相同的答案。如果您在 2 分钟内得到 3 个答案和 1 条评论且答案完全相同,那可能是您在问这个问题之前根本没有搜索过?
  • 顺便说一句,您可能想说“参数化查询”,而不是“参数化连接”。

标签: c# sql-server sqlconnection


【解决方案1】:

是的,您需要始终关闭连接。你也不需要第一个 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 块。这样,如果发生错误,您可以保证连接返回到Connection Pool

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

【讨论】:

  • 如果资源没有像我的例子那样被释放,.net 是否会自动释放资源。我的意思是一段时间后
  • 通常是的,但你不知道什么时候会发生。此外,它可能永远不会发生,例如在杀死进程的情况下。
  • 如何检查查询是否成功执行
  • @Learning 阅读msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx 关于连接池的信息。我认为这将使您的问题得到解决。
【解决方案2】:

您应该关闭它,否则在执行终结器之前,底层资源将一直使用。

最好的选择是实际处理连接(在数据库连接对象的特定情况下,这等于关闭它):

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();
}

【讨论】:

  • 如果我不使用 try catch ..finali.. 块怎么办
  • 对象将在离开using 块时被释放。如果usingtry 块内,并且发生异常,则连接将在 执行移动到catch/finally 之前被释放。
【解决方案3】:

你可以使用'using'

using(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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多