由于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
的最佳做法是什么?
答案 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就在读者身上。这是错误的。
对于同一连接上的多个呼叫,您可以:
'最佳实践'有点无定形。从来没有一致同意A人作为最佳实践的人比B推荐的更好,更不用说C,D或E.使用你自己的判断。