Для выполнения запросов к базе данных SQLite применяется класс SqliteCommand,
который представляет реализацию интерфейса System.Data.IDbCommand
. Для создания объекта SqliteCommand можно использовать один из его конструкторов:
SqliteCommand()
SqliteCommand(String)
: создает объект SqliteCommand, в конструктор которого передается выполняемое выражение SQL
SqliteCommand(String, SqliteConnection)
: создает объект SqliteCommand, в конструктор которого передается выполняемое выражение SQL и
используемое подключение к базе данных в виде объекта SqliteConnection
SqliteCommand(String, SqliteConnection, SqliteTransaction)
: третий параметр представляет применяемую транзакцию в виде объекта SqliteTransaction
Альтернативным способом создания объекта SqliteCommand представляет метод CreateCommand90
класса SqliteConnection:
using (var connection = new SqliteConnection("Data Source=usersdata.db")) { connection.Open(); SqliteCommand command = connection.CreateCommand(); }
Для конфигурации объекта SqliteCommand можно использовать ряд его свойств, некоторые из них:
CommandText: хранит выполняемую команду SQL
CommandTimeout: хранит временной интервал в секундах, после которого SqliteCommand прекращает попытки выполнить команду. По умолчанию равен 30 секундам. Значение 0 представляет отстутсвие интервала.
Parameters: предствляет параметры команды
Connection: предоставляет используемое подключение SqliteConnection
Например, установим свойства подключения и выполняемой команды:
using (var connection = new SqliteConnection("Data Source=usersdata.db")) { connection.Open(); SqliteCommand command = new SqliteCommand(); command.Connection = connection; command.CommandText = "CREATE TABLE Users(_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, Name TEXT NOT NULL)"; }
Чтобы выполнить команду, необходимо применить один из методов SqliteCommand:
ExecuteNonQuery: выполняет sql-выражение и возвращает количество измененных записей. Подходит для sql-выражений INSERT, UPDATE, DELETE, CREATE.
ExecuteReader(): выполняет sql-выражение и возвращает считанные из таблицы строки. Подходит для sql-выражения SELECT.
ExecuteScalar(): выполняет sql-выражение и возвращает одно скалярное значение, например, число. Подходит для sql-выражения SELECT в паре с одной из встроенных функций SQL, как например, Min, Max, Sum, Count.
Для создания базы данных применяется SQL-команда CREATE TABLE
, после которой указывается имя создаваемой таблицы и в скобках определения столбцов.
Например, создадим таблицу "Users", которая будет иметь три столбца - _id (уникальный идентификатор), Name (имя), Age (возраст):
using System; using Microsoft.Data.Sqlite; namespace HelloApp { class Program { static void Main(string[] args) { using (var connection = new SqliteConnection("Data Source=usersdata.db")) { connection.Open(); SqliteCommand command = new SqliteCommand(); command.Connection = connection; command.CommandText = "CREATE TABLE Users(_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, Name TEXT NOT NULL, Age INTEGER NOT NULL)"; command.ExecuteNonQuery(); Console.WriteLine("Таблица Users создана"); } Console.Read(); } } }
После выполнения команды в базе данных можно будет найти таблицу Users:
Для просмотра бд SQLite можно использовать специальный инструмент - DB Browser for SQLite.
Теперь добавим в выше созданную таблицу Users новый объект:
using System; using Microsoft.Data.Sqlite; namespace HelloApp { class Program { static void Main(string[] args) { using (var connection = new SqliteConnection("Data Source=usersdata.db")) { connection.Open(); SqliteCommand command = new SqliteCommand(); command.Connection = connection; command.CommandText = "INSERT INTO Users (Name, Age) VALUES ('Tom', 36)"; int number = command.ExecuteNonQuery(); Console.WriteLine($"В таблицу Users добавлено объектов: {number}"); } Console.Read(); } } }
Для вставки объекта используется sql-выражение INSERT, которое имеет следующий синтаксис:
INSERT INTO название_таблицы (столбец1, столбец2, столбецN) VALUES ( значение1, значение2, значениеN)
В ранее созданной таблице Users определены три столбца - __id и Age, которые хранят целое число, и Name, который хранит строку. Поэтому соответственно мы добавляем для столбца Name значение 'Tom', а для столбца Age число 36.
Здесь метод ExecuteNonOuery()
возвращает число затронутых строк (в данном случае добавленных в таблицу объектов).
Хотя нам необязательно возвращать результат метода, но данный результат может использоваться в качестве проверки, что операция, в частности, добавление,
прошла успешно.
После добавления данных мы сможем их увидеть через DB Browser for SQLite:
Подобным образом можно добавить несколько объектов:
using System; using Microsoft.Data.Sqlite; namespace HelloApp { class Program { static void Main(string[] args) { string sqlExpression = "INSERT INTO Users (Name, Age) VALUES ('Alice', 32), ('Bob', 28)"; using (var connection = new SqliteConnection("Data Source=usersdata.db")) { connection.Open(); SqliteCommand command = new SqliteCommand(sqlExpression, connection); int number = command.ExecuteNonQuery(); Console.WriteLine($"В таблицу Users добавлено объектов: {number}"); } Console.Read(); } } }
Для обновления применяется sql-команда UPDATE, которое имеет следующий синтаксис:
UPDATE название_таблицы SET столбец1=значение1, столбец2=значение2, столбецN=значениеN WHERE некоторый_столбец=некоторое_значение
Применим эту команду:
using System; using Microsoft.Data.Sqlite; namespace HelloApp { class Program { static void Main(string[] args) { string sqlExpression = "UPDATE Users SET Age=20 WHERE Name='Tom'"; using (var connection = new SqliteConnection("Data Source=usersdata.db")) { connection.Open(); SqliteCommand command = new SqliteCommand(sqlExpression, connection); int number = command.ExecuteNonQuery(); Console.WriteLine($"Обновлено объектов: {number}"); } Console.Read(); } } }
Здесь обновляется строка, в которой Name=Tom, то есть выше добавленный объект. Если в таблице будет несколько строк, у которых Name=Tom, то обновятся все эти строки.
Удаление производится с помощью sql-выражения DELETE, которое имеет следующий синтаксис:
DELETE FROM таблица WHERE столбец = значение
Удалим, например, всех пользователей, у которых имя Tom:
using System; using Microsoft.Data.Sqlite; namespace HelloApp { class Program { static void Main(string[] args) { string sqlExpression = "DELETE FROM Users WHERE Name='Tom'"; using (var connection = new SqliteConnection("Data Source=usersdata.db")) { connection.Open(); SqliteCommand command = new SqliteCommand(sqlExpression, connection); int number = command.ExecuteNonQuery(); Console.WriteLine($"Удалено объектов: {number}"); } Console.Read(); } } }
Во всех трех случаях фактически меняется только sql-выражение, а остальная логика остается неизменной. И мы также можем выполнять сразу несколько операций:
using System; using Microsoft.Data.Sqlite; namespace HelloApp { class Program { static void Main(string[] args) { Console.WriteLine("Введите имя:"); string name = Console.ReadLine(); Console.WriteLine("Введите возраст:"); int age = Int32.Parse(Console.ReadLine()); string sqlExpression = $"INSERT INTO Users (Name, Age) VALUES ('{name}', {age})"; using (var connection = new SqliteConnection("Data Source=usersdata.db")) { connection.Open(); // добавление SqliteCommand command = new SqliteCommand(sqlExpression, connection); int number = command.ExecuteNonQuery(); Console.WriteLine($"Добавлено объектов: {number}"); // обновление ранее добавленного объекта Console.WriteLine("Введите новое имя:"); name = Console.ReadLine(); sqlExpression = $"UPDATE Users SET Name='{name}' WHERE Age={age}"; command.CommandText = sqlExpression; number = command.ExecuteNonQuery(); Console.WriteLine($"Обновлено объектов: {number}"); } Console.Read(); } } }
Консольный вывод:
Введите имя: Tom Введите возраст: 36 Добавлено объектов: 1 Введите новое имя: Sam Обновлено объектов: 1