C# 如何修复此CA2000 for SqlCommand?

C# 如何修复此CA2000 for SqlCommand?,c#,.net,ca2000,C#,.net,Ca2000,我试图执行如下SQL查询,但VisualStudio抱怨出现CA2000问题 public static IDictionary<string, string> TemplateDirectories(string connectionString) { var directories = new Dictionary<string, string>(); using (var connection = new SqlConnection(connecti

我试图执行如下SQL查询,但VisualStudio抱怨出现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;
}
公共静态IDictionary TemplateDirectory(字符串连接字符串){
var directories=newdictionary();
使用(var连接=新的SqlConnection(connectionString)){
connection.Open();
使用(var command=newsqlcommand{Connection=Connection,CommandText=“select*from path”}){
var reader=command.ExecuteReader();
while(reader.Read())
目录[reader[“CODE”].ToString()]=reader[“PATH”].ToString();
reader.Close();
}
}
返回目录;
}
错误CA2000…对象“new SqlCommand()”未全部释放 异常路径。对对象“new”调用System.IDisposable.Dispose 在所有对它的引用都超出范围之前


我尝试了几种方法来修复它,但没有人成功。那么如何修复呢?

请尝试显式地分配
命令
参数:

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();
}

尝试显式分配
命令
参数:

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();
}

这是因为使用对象初始值设定项时存在陷阱

已初始化
SqlCommand
的方式,如果在初始化对象时发生一些异常,则
SqlCommand
将保持未处理状态

那么解决办法是什么呢。以老式的方式声明对象,以消除警告-

using (var command = new SqlCommand())
{
    command.Connection = connection;
    command.CommandText="select * from PATHS";
    ...
}
我发现了一篇关于这一点的非常好的文章,它提供了解决问题的更多细节和方法-

话虽如此,对于这个特殊问题,最好使用
SqlCommand
的构造函数,并像这样传递命令文本和连接对象(提供:Damien_the_unsiver的评论)


这是因为使用对象初始值设定项时存在陷阱

已初始化
SqlCommand
的方式,如果在初始化对象时发生一些异常,则
SqlCommand
将保持未处理状态

那么解决办法是什么呢。以老式的方式声明对象,以消除警告-

using (var command = new SqlCommand())
{
    command.Connection = connection;
    command.CommandText="select * from PATHS";
    ...
}
我发现了一篇关于这一点的非常好的文章,它提供了解决问题的更多细节和方法-

话虽如此,对于这个特殊问题,最好使用
SqlCommand
的构造函数,并像这样传递命令文本和连接对象(提供:Damien_the_unsiver的评论)


试着用using?Hi@garethb包装你的阅读器,我试着用(var reader=command.ExecuteReader()){…},但这个CA2000仍然抱怨..答案是正确的,它可以通过避免使用初始值设定项来修复-但你为什么要使用它呢?
SqlCommand
有一个特定的构造函数,它接受命令的文本和SqlConnection对象。请尝试使用?Hi@garethb将您的读取器包装在一个文件中,我尝试了
使用(var reader=command.ExecuteReader()){…
,但是这个CA2000仍然在抱怨..答案是正确的,它可以通过避免使用初始值设定项来修复-但是你为什么要使用初始值设定项呢?
SqlCommand
有一个特定的构造函数,它接受命令文本和SqlConnection对象。