DataReader. Множественное результирующее множество.
При его создании SqlDataReader не указывает ни на какую запись возвращенного набора данных. Поэтому для получения доступа к данным следует вызвать метод Read (Читать). Как показано в примере Connected, для получения доступа к отдельным полям или столбцам текущей строки можно использовать свойство Item (Элемент). Получить все поля строки можно также с помощью метода GetValues.
Object * fields [] = new Object *[NumberFields]; // новый Объект int NumberFields = reader › GetValues(fields); // читать поля
GetValue возвращает значение столбца в его исходном формате Для доступа к данным определенных форматов можно использовать методы GetBoolean (Прочитать Логическое значение), GetDecimal (Прочитать Десятичное число) и GetString (Прочитать Строку). Метод GetName возвращает имя определенного столбца.
Еще раз повторим, что при использовании DataReader в каждый момент времени доступна только одна запись. Убедитесь в том, что по завершении работы с DataReader вы его закрыли.
Множественное результирующее множество
Класс SqlDataReader может хранить несколько результирующих множеств, что продемонстрировано в примере DataReader. Два запроса, разделенные точкой с запятой, являются двумя SQL-запросами, которые приводят к возврату двух результирующих множеств, по одному на каждый запрос.
String *ConnString = // Строка "server=localhost;uid=sa;pwd=; database=Northwind"; String *cmd = // Строка "select Customerld, CompanyName from Customers where // выбрать Customerld, CompanyName из Клиентов где Customerld like 'T%'/select Customerld, CompanyName…" // Customerld подобно "I % '; выбрать Customerld, CompanyName … int ResultSetCounter = -1; int NumberFields = 0; reader = command › ExecuteReader(); // команда if (reader!= 0) { NumberFields = reader › FieldCount; Object *fields[] = new Object*[NumberFields]; // новый // Объект Console::WriteLine ( "Result Set\tCustomerId\tCompanyName"); // "Результат Set\tCustomerId\tCompanyName"); do { ResultSetCounter++; while(reader › Read() == true) // пока Чтение () // == истина { NumberFields = reader › GetValues(fields); // поля Console::Write(" { 0 } ", ResultSetCounter.ToStringt)); for (int i = 0; i<NumberFields; i++) { Console::Write( "\t\t{0}", fields[i]); // поля Console::Write("\n"); // Запись }; } while(reader › NextResult() == true); // пока NextResult () // == истина }
Метод FieldCount возвращает количество столбцов в результирующем множестве. Поскольку метод GetValues возвращает данные в их исходном формате, в качестве аргументов ему передается массив объектов. Метод NextResult обеспечивает перемещение к следующему результирующему множеству.
Результатом работы программы DataReader будет вывод на экран следующих строк:
Result Set Customerld 'CompanyName 0 THEBI The Big Cheese 0 THECR The Cracker Box 0 TOMSP Toms Spezialitaten 0 TORTU Tortuga Restaurante 0 TRADH Tradigao Hipermercados 0 TRAIH Trail's Head Gourmet Provisioners 1 WANDK Die Wandernde Kuh 1 WARTH Wartian Herkku 1 WELLI Wellington Importadora 1 WHITC White Clover Markets 1 WILMK Wilman Kala 1 WOLZA Wolski Zajazd