1

我正在尝试执行如下 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()' 未沿所有异常路径进行处理。在对对象“new SqlCommand()”的所有引用超出范围之前调用 System.IDisposable.Dispose。

我尝试了几种方法来修复它,但没有一种方法奏效。那么如何修复呢?

4

2 回答 2

3

尝试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();
}
于 2016-08-15T05:16:02.863 回答
3

这是因为使用对象初始值设定项时的一个陷阱。

方式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))
 {
  ...
 }
于 2016-08-15T05:30:35.653 回答