我试图执行如下SQL查询,但Visual Studio抱怨CA2000。
public static IDictionary<string, string> TemplateDirectories(string connectionString) {
var directories = new Dictionary<string, string>();
using (var connection = new SqlConnection(connectionString)) {
connection.Open();
using (var command = new SqlCommand { Connection = connection, CommandText = "select * from PATHS" }) {
var reader = command.ExecuteReader();
while (reader.Read())
directories[reader["CODE"].ToString()] = reader["PATH"].ToString();
reader.Close();
}
}
return directories;
}
错误CA2000…object 'new SqlCommand()'不会全部销毁异常路径。调用System.IDisposable.Dispose处理对象new
SqlCommand()'之前对它的所有引用都超出了作用域。
我尝试了几种方法来修复它,但没有一个有效。那么如何修复呢?
这是因为在使用对象初始化式时存在一个缺陷。
初始化SqlCommand
的方式,如果在初始化对象时出现异常,SqlCommand
将不被处置。
那么解是什么呢?以老式方式声明对象,以摆脱警告-
using (var command = new SqlCommand())
{
command.Connection = connection;
command.CommandText="select * from PATHS";
...
}
我找到了一篇非常好的文章,它提供了更多的细节和方法来解决这个问题http://haacked.com/archive/2013/01/11/hidden-pitfalls-with-object-initializers.aspx/
话虽如此,对于这个特定的问题,最好使用SqlCommand
的构造函数并像这样传递命令文本和连接对象(礼貌:Damien_The_Unbeliever的评论)
string commandText = "select * from PATHS";
using (var command = new SqlCommand(commandText, connection))
{
...
}
尝试显式地分配command
参数:
using (var command = new SqlCommand())
{
command.Connection = connection;
command.CommandText="select * from PATHS";
var reader = command.ExecuteReader();
while (reader.Read())
directories[reader["CODE"].ToString()] = reader["PATH"].ToString();
reader.Close();
}