Для чтения данных из базы данных 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"]
.