处置SqlCommand

时间:2018-03-13 15:19:06

标签: c# ado.net idisposable sqlconnection sqlcommand

由于SqlCommand实现IDisposable,我通常会按如下方式处理ADO查询。

using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(query, connection))
{
    // Execute command, etc. here
}

但是,如果我需要在单个连接期间执行多个命令怎么办?我真的需要为每个命令添加一个新的using块吗?

我从微软发现的示例中不会使用using块来SqlCommand(或甚至调用Dispose())。有关处置SqlCommand的最佳做法是什么?

4 个答案:

答案 0 :(得分:2)

using语句确保即使在对象上调用方法时发生异常,也会调用Dispose。您可以通过将对象放在try块中,然后在Dispose块中调用finally来获得相同的结果。

在这种情况下,您对每个命令块使用using

using (SqlConnection connection = new SqlConnection(connectionString))
{
   using (SqlCommand cmd1= new SqlCommand(query1, connection))
   {
   }

   using (SqlCommand cmd2= new SqlCommand(query2, connection))
   {
   }  
}

答案 1 :(得分:2)

当然,最佳做法是处置它们。

using (SqlConnection connection = new SqlConnection(connectionString))
{
   connection.Open();

   using (SqlCommand command1 = new SqlCommand(query1, connection))
   {
      // Execute command, etc. here
   }

   using (SqlCommand command2 = new SqlCommand(query2, connection))
   {
      // Execute command, etc. here
   }

   using (SqlCommand command3 = new SqlCommand(query3, connection))
   {
      // Execute command, etc. here
   }
}

MSDN可能无法显示,因为在SqlCommand的情况下它是not really needed。但在我看来,微软不会在每个实现IDdisosable的对象上使用这种模式,因为人们并没有习惯它。

答案 2 :(得分:1)

不,不。您可以通过两种方式将多个命令捆绑在一个连接和命令中。

第一种方法是重用现有的CMD对象,但根据需要更改CommandText和其他CMD.properties。

using (SqlConnection con = new SqlConnection(connectionString)) {

    con.Open();

    using (SqlCommand cmd = new SqlCommand(query1, con)) {
        // cmd.CommandType = CommandType.xxxxx
        // add any parameters
        // Execute()

        cmd.CommandText = query2;
        // reset CommandType if needed
        // adjust parameters if needed
        // Execute()

        cmd.CommandText = query 3;
        // reset CommandType if needed
        // adjust parameters if needed
        // Execute()
    }
    con.Close();
}

第二种方法是在数据库服务器上创建存储过程并在一个CMD对象中调用它

-- Database
CREATE PROCEDURE schema.sproc_CommandBatch (
    -- any variables here
) AS
BEGIN
    -- query 1

    -- query 2

    -- query 3
END
GO


// C#
using (SqlConnection con = new SqlConnection(connectionString)) {

    con.Open();

    using (SqlCommand cmd = new SqlCommand("schema.sproc_CommandBatch", con)) {
        // cmd.CommandType = CommandType.StoredProcedure
        // add any parameters
        // Execute()
    }
    con.Close();
}

答案 3 :(得分:0)

最佳实践是,如果它实现了IDisposable,那么Dispose()就可以了。 实际上,示例here都会调用Dispose。皱纹:

第一个示例,它打开一个SqlDataReader,在finally子句中的命令上调用.Close()。事实上,.Close只是一个包装.Dispose()(并且不再出现在文档中)。 Jonathan Wood在他的评论中指出,Close就在读者身上。这是错误的。

对于同一连接上的多个呼叫,您可以:

  1. 重复使用one命令(使用一个声明)。我不喜欢这样 我自己,但那只是我:我发现它......丑陋。
  2. 在多个使用中使用多个命令。这就是我的所作所为。
  3. '最佳实践'有点无定形。从来没有一致同意A人作为最佳实践的人比B推荐的更好,更不用说C,D或E.使用你自己的判断。