Как исправить это CA2000 для SqlCommand?

Я пытаюсь выполнить запрос 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 ... объект 'new SqlCommand()' расположен не по всем путям исключений. Вызовите System.IDisposable.Dispose для объекта 'new SqlCommand()' до того, как все ссылки на него выйдут из области видимости.

Я пробовал несколько способов исправить это, но никто не работал. Так как исправить?

2 ответа

Решение

Это связано с ловушкой при использовании инициализаторов объектов.

Путь 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();
}
Другие вопросы по тегам