Книга: Обработка баз данных на Visual Basic®.NET

Объект DataReader

Объект DataReader

Данный объект предназначен для чтения в прямом направлении небуферизуемого потока записей, полученных от метода ExecuteReader объекта Command. Объект DataReader в основном эквивалентен объекту Recordset модели ADO 2.X, который также предназначен для чтения в прямом направлении. Объект DataReader предлагает наиболее быстрый способ доступа к источнику данных, но в нем не предусмотрены возможности прокрутки и обновления данных. Поскольку данные не буферизуются и не сохраняются в кэше, этот метод прекрасно подходит для извлечения большого объема данных. Для перехода к следующей записи объекта DataReader нужно вызвать его метод Read.

Кроме коллекции Fields, доступ к полям каждой записи можно осуществить с помощью строго типизированных методов. Доступ к полям с помощью коллекции Fields аналогичен способу доступа к полям в модели ADO 2.X.

X = MyReader("Myfield")

НА ЗАМЕТКУ

Объект DataReader не имеет явного конструктора, т.е. его нельзя создать с помощью оператора New(). Для инициализации нового объекта нужно вызвать метод ExecuteReader объекта Command.

Зная тип данных в поле, доступ к нему можно получить с помощью типизированных методов доступа. Эти методы извлекают значение поля по номеру поля, нумерация которого начинается с нуля, например:

X = MyReader.GetInt16(1)

или

X = MyReader.GetString(2)

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

Для демонстрации способов использования этих методов выполните следующее.

1. Создайте под кнопкой ExecuteScalar дополнительную кнопку.

2. В окне свойств Properties укажите значение cmdExecuteReader для свойства (Name) и значение ExecuteReader для свойства Text.

3. Создайте код подпрограммы btnExecuteReader_Click, приведенный в листинге 4.8.

НА ЗАМЕТКУ

Кроме способов использования объекта DataReader, в этом примере демонстрируются и другие функциональные возможности. Например, здесь помимо членов Text и StoredProcedure свойства-перечисления CommandType для указания типа команды используется член TableDirect. Он содержит имя таблицы, все поля которой возвращаются данной командой. Учтите, что этот член перечисления поддерживается только для провайдера данных ODBC.

Представления обычно обрабатываются точно также, как и таблицы. Следовательно, при использовании члена TableDirect свойства-перечисления CommandType можно указывать не только имя таблицы, но и имя представления.

Листинг 4.8. Код создания объекта DataReader и извлечения значений полей с помощью представления и члена TableDirect

Private Sub btnExecuteReader_Click(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles btnExecuteReader.Click
 ' Создание экземпляра объекта Connection.
 Dim cnn As OleDbConnection = New OleDbConnection( _
  "provider=SQLOLEDB;server=localhost;uid=sa;database=pubs")
 ' Создание экземпляра объекта Command.
 Dim As OleDbCommand = New OleDbCommand()
 txtResults.Clear()
 ' Указание подключения и текста команды
 cmd.Connection = cnn
 cmd.CommandType = CommandType.TableDirect
 cmd.CommandText = "EmployeeJobs_View"
 ' Открытие подключения перед вызовом метода
 ExecuteReader. cnn.Open()
 Dim reader As OleDbDataReader
 reader = cmd.ExecuteReader{)
 While reader.Read()
  txtResults.Text = txtResults.Text & reader("fname") & _
   ControlChars.Tab & reader("lname") & _
   ControlChars.Tab & ControlChars.Tab & _
   reader("job_desc") & ControlChars.CrLf
 End While
 reader.Close()
 cnn.Close()
End Sub

(Здесь предполагается, что представление EmployeeJobs_view уже создано с помощью подпрограммы btnNonQuery_Click из листинга 4.4, как описано выше. – Прим. ред.)

НА ЗАМЕТКУ

Перед попыткой доступа к данным объекта DataReader не забывайте вызывать метод Read(). В отличие от объекта Recordset в модели ADO 2.X, в которой после загрузки данных текущее расположение автоматически находится на первой записи, в модели ADO.NET в объекте DataReader нужно явно указать текущее расположение возле первой записи с помощью исходного вызова метода

Для организации доступа к данным можно также применить цикл While с более эффективными строго типизированными методами доступа к полям.

While reader. Read()
 txtResults.Text = txtResults.Text & reader.GetString(1) & _
  ControlChars.Tab & reader.GetString(2) & _
  ControlChars.Tab & ControlChars.Tab & _
  reader. GetString(0) & ControlChars.Ctrlf
End While

Еще одно изменение, которое диктуется личным вкусом и стилем программирования автора, заключается в объединении определения объекта DataReader и выполнения метода ExecuteReader в одной строке, т.е. вместо фрагмента кода

Dim reader As OleDbDataReader reader = cmd.ExecuteReader()

можно использовать следующую строку:

Dim reader As OleDbDataReader = cmd.ExecuteReader()

После запуска приложения DataProviderObjects щелкните на кнопке ExecuteReader, и в текстовом поле справа будут отображены данные из представления EmployeeJobs_view, как показано на рис. 4.4.


РИС. 4.4. Результаты выполнения команды ExecuteReader из листинга 4.8

НА ЗАМЕТКУ

По окончании использования объекта DataReader следует вызвать метод Close. Дело в том, что выходные данные или возвращаемые значения объекта Command недоступны до тех пор, пока объект DataReader открыт. Он остается открытым до тех пор, пока открыто само подключение или объект DataReader.

Объект DataReader также предлагает простой и эффективный способ создания Web-страниц для работы сданными на основе элемента управления DataGrid, который подробно рассматривается в главе 11, "Web-формы: приложения на основе ASP.NET для работы с базами данных".

Оглавление книги


Генерация: 1.332. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз