Можно ли использовать DataReader после удаления объекта Command?

Я создал небольшой класс вспомогательных методов для работы с базой данных. Меня интересует этот метод:

Shared Function GetReader(sql As String, con As OleDbConnection) As OleDbDataReader

   Dim cmd As New OleDbCommand(sql, con)
   Dim reader As OleDbDataReader = cmd.ExecuteReader
   cmd.Dispose()
   Return reader

End Function

Буду ли я сталкиваться с какими-то проблемами, сначала удаляя объект Command, а затем используя DataReader?

Я бы предпочел, чтобы код вызывался аккуратно, не создавая/удаляя объекты Command все время (кажется излишним, когда это можно обернуть вспомогательным методом выше).


person misha256    schedule 08.10.2014    source источник
comment
Между прочим, с точки зрения дизайна я не слишком беспокоюсь о возврате DataReader в вызывающий код. Вспомогательные методы не будут использоваться вне низкоуровневого кода базы данных. т.е. уровень доступа к данным их не увидит.   -  person misha256    schedule 08.10.2014


Ответы (2)


Буду ли я сталкиваться с какими-то проблемами, сначала удаляя объект Command, а затем используя DataReader?

No

Но это более чистый код:

Shared Function GetReader(sql As String, con As OleDbConnection) As OleDbDataReader

   Using cmd As New OleDbCommand(sql, con)
      Dim reader As OleDbDataReader = cmd.ExecuteReader
      'cmd.Dispose() 'Not needed here, will be invoked automatically
      Return reader
   End Using

End Function

Боковые примечания:

  • Рассмотрите возможность использования Using Statements всегда, чтобы убедиться, что все ресурсы освобождены.

  • Подумайте об утилизации соединения и считывателя, когда они вам больше не понадобятся. И не бойтесь закрывать, а затем снова открывать соединение, так как соединения по умолчанию хранятся в пуле, и вы должны закрыть их как можно скорее, особенно если ваше приложение в какой-то форме загружено.

person Sameh Deabes    schedule 08.10.2014

В этом фрагменте нет ничего плохого. Перед выполнением cmd.Dispose() вы должны назначить результат запроса считывателю, т. е. Dim reader As OleDbDataReader = cmd.ExecuteReader, чтобы читатель имел результат даже после удаления cmd. и он будет удерживать значение до тех пор, пока соединение не получит closed или не произойдет reader .Dispose().

person Community    schedule 08.10.2014