Чтение результатов запроса и SqliteDataReader

Последнее обновление: 02.03.2021

Для чтения данных из базы данных SQLite применяется метод - ExecuteReader() класса SqliteCommand. Этот метод возвращает объект SqliteDataReader, который используется для чтения данных.

Основные свойства класса SqliteDataReader, которые мы можем использовать при получении данных:

  • HasRows: указывает, содержит ли SqliteDataReader как минимум одну строку

  • Item[Int32]: возвращает значение столбца, номер которого передается в квадратных скобках

  • Item[String]: возвращает значение столбца, название которого передается в квадратных скобках

Среди методов класса SqliteDataReader, которые применяются при работе с данным классом, следует выделить следующие:

  • Close(): закрывает объект SqliteDataReader

  • GetValue(Int32): возвращает значение столбца, номер которого передается в качестве параметра (нумерация начинается с нуля)

  • Read(): считывает следующую строку в полученном наборе

Например, выведем на консоль все данные из таблицы Users, которая была созданна в прошлой теме:

using System;
using Microsoft.Data.Sqlite;

namespace HelloApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string sqlExpression = "SELECT * FROM Users";
            using (var connection = new SqliteConnection("Data Source=usersdata.db"))
            {
                connection.Open();

                SqliteCommand command = new SqliteCommand(sqlExpression, connection);
                using (SqliteDataReader reader = command.ExecuteReader())
                {
                    if (reader.HasRows) // если есть данные
                    {
                        while (reader.Read())   // построчно считываем данные
                        {
                            var id = reader.GetValue(0);
                            var name = reader.GetValue(1);
                            var age = reader.GetValue(2);

                            Console.WriteLine($"{id} \t {name} \t {age}");
                        }
                    }
                }
            }
            Console.Read();
        }
    }
}

Консольный вывод:

2		Alice		32		
3		Bob		28		
4		Sam		36		

Для выборки данных из БД используется sql-выражение SELECT. В данном случае мы выбираем все столбцы всех строк таблицы. Получив при выполнении запроса объект SqliteDataReader, мы можем считать все полученные данные.

Но вначале мы проверяем, а есть ли вообще данные с помощью свойства HasRows. И если данные есть, в цикле while (reader.Read()) в порядке следования столбов получаем данные с помощью метода GetValue(), который возвращает данные в виде объекта типа object. Причем столбцы в выборке идут именно в том порядке, в котором они определены в таблице.

CREATE TABLE Users(_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, Name TEXT NOT NULL, Age INTEGER NOT NULL)

Например, столбец _id идет первым, поэтому для его получения применяется метод reader.GetValue(0). А столбец Age идет третьим, поэтому его значения получаем с помощью reader.GetValue(2).

Выше для извлечения данных из строки использовался метод GetValue(), в который передавался номер столбца. В качестве альтернативы мы могли бы обращаться к данным через индексатор ридера:

while (reader.Read())
{
	object id = reader[0];
	object name = reader[1];
	object age = reader[2];

	Console.WriteLine($"{id} \t{name} \t{age}");
}

Однако, мы можем сомневаться в порядке следования столбцов, и в этом случае можно передавать названия столбцов:

while (reader.Read())
{
    object id = reader["_id"];
    object name = reader["Name"];
    object age = reader["Age"];
    Console.WriteLine($"{id} \t {name} \t {age}");
}

В этом случае результат будет аналогичным. Однако здесь следует учитывать регистр передаваемых названий столбцов. Так, в таблице Users определены столбцы "_id" (с маленькой буквы), "Name" (с большой буквы), "Age" (с большой буквы), соответственно, мы пишем reader["_id"], а не reader["_Id"]; и reader["Name"], а не reader["name"].

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850