我正在使用这样的辅助方法:
private OdbcCommand GetCommand(string sql)
{
string conString = "blah";
var con = new OdbcConnection(conString);
var cmd = new OdbcCommand(sql, con);
return cmd;
}
然后我像这样使用它:
using (var cmd = GetCommand("select * from myTable")
{
cmd.connection.open();
using(var reader = cmd.ExecuteReader())
{
}
}
这是第二个例子:
public static OdbcDataReader GetReader(string conString,string sql)
{
var cmd = GetCommand(conString, sql);
cmd.Connection.Open();
return cmd.ExecuteReader();
}
像这样使用:
using(var reader = GetReader("blah","select * from blah")
{
}
在这两种情况下,我是否处理了连接和cmd对象?我认为第一个连接没有被处理掉,第二个连接和cmd都没有,是吗?
我是否需要做很长的事情来确保正确处理,或者是否采用更短的方法?
using (var con ...)
using (var cmd)
using (var reader)
答案 0 :(得分:8)
简而言之,如果它有Dispose
,那么你应该调用它。你不能假设另一个对象会处理你为它传递的对象。
处理命令对象时,不会释放连接对象,因为完成命令后可以再次使用该连接。处理每种方法是最好的方法。
答案 1 :(得分:4)
对于将Reader包装在using块中的两个示例,如果使用接受CommandBehavior的覆盖并将其设置为“CloseConnection”,则将关闭与现有代码的连接
using(var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)){}
请参阅http://msdn.microsoft.com/en-us/library/s9bz2k02.aspx
Microsoft知道在阅读器被使用时连接必须保持打开状态,因此创建了关闭Reader时关闭连接的选项。
在第二个示例中,命令没有处理,这是正确的。