Выполнение запросов к БД SQLite и SqliteCommand

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

Для выполнения запросов к базе данных 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 в .NET Core и NET 6

Для просмотра бд 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:

Добавление в БД SQLite через SqliteCommand в C# и .NET

Подобным образом можно добавить несколько объектов:

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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850