Можно ли вводить DbCommand перед итерацией DbDataReader? - PullRequest
6 голосов
/ 21 октября 2011

У меня есть простое приложение, которое должно выполнять определенные запросы, чтобы получить информацию о схеме базы данных. Я написал простой метод, который выполняет запрос и возвращает читателя, что-то вроде этого -

public static DbDataReader ExecuteQuery(DbConnection connection,string sql)
{
   DbCommand command = connection.CreateCommand();
   command.CommandText = sql;

   using(command)
   {
      return command.ExecuteReader();    
   }
}

Код вызова закрывает соединение и соответственно удаляет устройство чтения и соединение.

Мой вопрос - это нормально / правильно ли вводить экземпляр команды (как это делается с помощью блока using) перед итерацией читателя? Я не ожидаю, что какие-либо параметры OUT будут заполнены после закрытия считывателя. Есть ли в ADO.NET API какие-либо строгие указания по этому поводу?

1 Ответ

0 голосов
/ 21 октября 2011

Когда вы оставляете блок using в вашем методе, команда закрывается и удаляется, если вы можете использовать ридер из вызывающей стороны, значит, он все еще работает.

Команды предназначены для выполнения операторов в соединении, но не содержат никаких данных, поэтому это работает. Пока соединение открыто, вы можете использовать свой ридер.

PS. есть также хорошая перегрузка ExecuteReader, которая инструктирует Reader закрывать соединение непосредственно для вас при утилизации, полезно, когда соединение создается локально, как вы делаете с помощью команды и не передается извне.

...