Как исправить это 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();
}