Рейтинговые книги
Читем онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 389 390 391 392 393 394 395 396 397 ... 642

Объекты чтения данных удобны, если нужно быстро пройти по большому объему данных без необходимости иметь их представление в памяти. Например, в случае запрашивания 20 000 записей из таблицы с целью их сохранения в текстовом файле помещение такой информации в объект DataSet приведет к значительному расходу памяти (поскольку DataSet хранит полный результат запроса в памяти).

Более эффективный подход предусматривает создание объекта чтения данных, который максимально быстро проходит по всем записям. Тем не менее, имейте в виду, что объекты чтения данных (в отличие от объектов адаптеров данных, которые рассматриваются позже) удерживают подключение к источнику данных открытым до тех пор, пока вы его явно не закроете.

Объекты чтения данных получаются из объекта команды с применением вызова ExecuteReader(). Объект чтения данных представляет текущую запись, прочитанную из базы данных. Он имеет метод индексатора (например, синтаксис [] в языке С#), который позволяет обращаться к столбцам текущей записи. Доступ к конкретному столбцу возможен либо по имени, либо по целочисленному индексу, начинающемуся с нуля.

В приведенном ниже примере использования объекта чтения данных задействован метод Read(), с помощью которого выясняется, когда достигнут конец записей (в случае чего он возвращает false). Для каждой прочитанной из базы данных записи с применением индексатора типа выводится модель, дружественное имя и цвет каждого автомобиля. Обратите внимание, что сразу после завершения обработки записей вызывается метод Close(), которые освобождает объект подключения.

...

// Получить объект чтения данных посредством ExecuteReader().

using(SqlDataReader myDataReader = myCommand.ExecuteReader())

{

  // Пройти в цикле по результатам.

  while (myDataReader.Read())

  {

     WriteLine($"-> Make: { myDataReader["Make"]},

         PetName: { myDataReader["PetName"]},

         Color: { myDataReader["Color"]}.");

  }

}

ReadLine();

Индексатор объекта чтения данных перегружен для приема либо значения string (имя столбца), либо значения int (порядковый номер столбца). Таким образом, текущую логику объекта чтения можно сделать яснее (и избежать жестко закодированных строковых имен), внеся следующие изменения (обратите внимание на использование свойства FieldCount):

while (myDataReader.Read())

{

  for (int i = 0; i < myDataReader.FieldCount; i++)

  {

    Console.Write(i != myDataReader.FieldCount - 1

      ? $"{myDataReader.GetName(i)} = {myDataReader.GetValue(i)}, "

      : $"{myDataReader.GetName(i)} = {myDataReader.GetValue(i)} ");

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

  }

  Console.WriteLine();

}

Если в настоящий момент скомпилировать проект и запустить его на выполнение, то должен отобразиться список всех автомобилей из таблицы Inventory базы данных AutoLot. В следующем выводе показано несколько начальных записей:

***** Fun with Data Readers *****

***** Info about your connection *****

Database location: .,5433

Database name: AutoLot

Timeout: 30

Connection state: Open

id = 1, Make = VW, Color = Black, Petname = Zippy

id = 2, Make = Ford, Color = Rust, Petname = Rusty

id = 3, Make = Saab, Color = Black, Petname = Mel

id = 4, Make = Yugo, Color = Yellow, Petname = Clunker

id = 5, Make = BMW, Color = Black, Petname = Bimmer

id = 6, Make = BMW, Color = Green, Petname = Hank

id = 7, Make = BMW, Color = Pink, Petname = Pinky

id = 8, Make = Pinto, Color = Black, Petname = Pete

id = 9, Make = Yugo, Color = Brown, Petname = Brownie

Получение множества результирующих наборов с использованием объекта чтения данных

Объекты чтения данных могут получать несколько результирующих наборов с применением одиночного объекта команды. Например, если вы хотите получить все строки из таблицы Inventory, а также все строки из таблицы Customers, тогда можете указать два SQL-оператора Select, разделив их точкой с запятой:

sql += ";Select * from Customers;";

На заметку! Точка с запятой в начале строки опечаткой не является. В случае использования множества операторов они должны разделяться точками с запятой. И поскольку начальный оператор не содержал точку с запятой, она добавлена здесь в начало второго оператора.

После получения объекта чтения данных можно выполнить проход по каждому результирующему набору, используя метод NextResult(). Обратите внимание, что автоматически возвращается первый результирующий набор. Таким образом, если нужно прочитать все строки каждой таблицы, тогда можно построить следующую конструкцию итерации:

do

{

  while (myDataReader.Read())

  {

    for (int i = 0; i < myDataReader.FieldCount; i++)

    {

      Console.Write(i != myDataReader.FieldCount - 1

        ? $"{myDataReader.GetName(i)} = {myDataReader.GetValue(i)}, "

1 ... 389 390 391 392 393 394 395 396 397 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

Оставить комментарий