如何修复SqlCommand的CA2000



我试图执行如下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();
}

相关内容

  • 没有找到相关文章

最新更新