* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Применение объекта DataReader
8 февраля 2009
Исполнить с помощью объекта Command команду, не возвращающую значении или возвращающую единственное значение, довольно просто. Чтобы использовать объект Command с запросами, возвращающими несколько значений, обратитесь к методу Execute Reader. Он возвращает объект DataReader.
DataReader — это упрощенный объект, обеспечивающий быстрое и эффектив- ное последовательное однонаправленное чтение данных. Объект Data Reader позво- ляет перебирать записи результирующего набора, передавая нужные значения на- прямую коду приложения. При этом DataSet намного эффективнее, но менее гибок по сравнению с DataAdapter. Данные, полученные через объект DataSet, доступны только для чтения, поэтому их нельзя модифицировать средствами DataSet. При этом данные разрешается просматривать только в одном направлении: нельзя вер- нуться к записи, прочитанной ранее. Кроме того, объект DataReader ориентирован на использование постоянных соединений и, пока он существует, требует моно- польного доступа к активному соединению. Создание объекта DataReader Объект DataReader нельзя создать напрямую, это делается путем вызова метода ExecuteReader объекта Command. Подобно другим членам классов провайдеров дан- ных, у каждого класса DataProvider есть собственный класс DataReader. объект OleDbCommand возвращает OleDbDataReader, а объект SqlCommand — Sql Data Reader, например: Visual Basic .NET Этот пример предполагает наличие объектов OleDbCommand и SqlCommand с именами myOleDbCommand and mySqlCommand соответственно. Dim inyOleDbReader As System. Data.OleDb. OleDbDataReader Dim mySqlReader As System.Data.SqlClient.SqlDataReader Эта команда создает новый объект OleDbReader и записывает его в переменную. myOleDbReader = myOleDbCommand.ExecuteReaderO Эта команда создает новый объект SqlReader и записывает его в переменную. mySqlReader - mySqlCommand.ExecuteReaderO Visual C# // Этот пример предполагает наличие объектов OleDbCommand и // SqlCommand с именами myOleDbCominand and mySqlCommand соответстаенно. System.Data.OleDb.OleDbDataReader inyOleDbReader; System.Data.SqlClient.SqlDataReader mySqlReader; // Эта команда создает новый объект OleDbReader и записывает его в переменную. myOleDbReader - myOleDbCommand.ExecuteReaderO; // Эта команда создает новый объект SqlReader и записывает его в переменную. mySqlReader = mySqlCommand.ExecuteReaderO; При вызове метода ExecuteReader объект Command исполняет представленную им команду и создает объект DataReader соответствующего типа, который можно записать в переменную ссылочного типа. Организация простого доступа к данным с помощью объекта DataReader Получив ссылку на объект DataReader, можно просматривать записи, загружая нуж- ные данные в память. У нового объекта DataReader указатель чтения устанавливает- ся на первую запись результирующего набора. Чтобы сделать ее доступной, следует вызвать метод Read. Если запись доступна, метод Read переводит указатель объекта DataReader к следующей записи и возвращает True (true), в противном случае метод Read возвращает False (false). Таким образом, метод Read используют для перебора записей в цикле While (while), например, так: Visual Basic .NET While myDataReader.ReadO Этот код будет однократно исполнен для каждой записи результирующего набора. End While Visual C# while (myDataReader.ReadO) ! // Этот код будет однократно исполнен // для каждой записи результирующего набора. } При чтении записи с помощью объекта DataReader значения отдельных полей доступны через индексатор или свойство по умолчанию в виде массива объектов, к элементам которого разрешается обращаться по индексу либо по имени поля, на- пример: Visual Basic .NET While myDataReader.ReadO Dim rnyObject As Object = myDataReader(3) Dim myOtherObject As Object - myDataReader("CustomerID") End While Visual C# while (myDataReader.ReadO) { object myObject = myDataReader[3]; object myOtherObject - myDatafieader["CustomerID"]; } При этом способе доступа DataReader предоставляет все значения в виде объек- тов, хотя из DataReader допустимо извлекать и типизированные данные. Более по- дробно об этом рассказано далее. Прочитав данные с помощью DataReader, следует вызвать метод Close, чтобы за- крыть DataReader, в противном случае объект DataReader будет удерживать моно- польный доступ к активному соединению, сделав его недоступным другим объек- там. При вызове метода Execute Reader, установив свойство Command Behavior в CloseConneciion, вы автоматически закроете соединение, не вызывая метод Close явно: Visual Basic .NET myDataReader.Closef) Visual C# myDataReader.CloseO; Выборка столбца с помощью объекта DataReader Следующий пример демонстрирует перебор записей результирующего набора для вывода содержимого одного из столбцов в окне Console. Этот пример предполагает наличие объекта OleDbCommand с именем myOleDbCommand, свойство Connection которого определяет соединение с именем myConnection. Visual Basic .NET ' Открыть активное соединение. myConnection.Open() ' Создать объект DataReader и записать его в переменную myReader. Dim myReader As System.Data.OleDb.OleDbDataReader - myOleDbCornmana. ExecuteReader() 1 Вызвать метод Read перед попыткой чтения данных. While myReader.Read() Получить доступ к полю можно по имени * либо по его порядковому номеру. Console.WriteLine(myReader("Customers").ToString()) End While ' Обязательно закрывайте DataReader, закончив работу с ним, myReader.Close() ' и соединение, если оно больше не нужно. myConnection.Close Visual C# // Открыть активное соединение, myConnection.Ореп(); // Создать объект DataReader и записать его в переменную oiyReader. System. Data.OleDb.OleDbDataReader -nyReader = myOleDbCornmand. ExecuteReader(); // Вызвать метод Read перед попыткой чтения данных. while (myReader.ReadO) { // Получить доступ к полю можно по имени // лкбо по его порядковому номеру. Console.WriteLine(myReader["Customers"].ToString()); } // Обязательно закрывайте DataReader, закончив работу с ним, myReader,Closet); // и соединение, если оно больше не нужно myConnection.Close; ^ Как получить доступ к данным с помощью объекта DataReader 1. Вызовите метод Execute Reader объекта Command и запишите результирующий объект DataReader в переменную соответствующего типа. 2. Обработайте результирующий набор в цикле While (while}, выполняя любые дей- ствия над данными внутри цикла. Прежде чем обращаться к данным, следует вызвать метод Read объекта DataReader. 3. Закончив, вызовите метод Close объекта DataReader, чтобы закрыть соединение.