Параметризация запросов к БД Sqlite

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

Пакет Microsoft.Data.Sqlite поддерживает параметризацию запросов. Для определения параметров применяется класс SqliteParameter. Этот класс имеет ряд конструкторов, наиболее используемые из них:

  • SqliteParameter()

  • SqliteParameter(String, Object): первый параметр конструктора передает имя, а второй - значение параметра

  • SqliteParameter(String, SqliteType): первый параметр конструктора передает имя параметра, а второй - его тип в виде объекта SqliteType

  • SqliteParameter(String, SqliteType, Int32): первый параметр конструктора передает имя параметра, второй - его тип, а третий - максимальный размер значения параметра в байтах

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

Для конфигурации параметров можно использовать их свойства, среди которых следует выделить следующие:

  • SqliteType: задает или устанавливает тип параметра в виде типа SqliteType

  • IsNullable: указывает, допускает ли параметр значение null

  • ParameterName: представляет имя параметра

  • Size: хранит максимальный размер данных параметра в байтах

  • Value: хранит значение параметра

Следует учитывать, что все параметры в Microsoft.Data.Sqlite являются входными.

После определения параметров они добавляются в коллекцию Parameters объекта SqliteCommand.

Применим параметры для добавления данных:

using System;
using Microsoft.Data.Sqlite;

namespace HelloApp
{
    class Program
    {
        static void Main(string[] args)
        {
            // данные для добавления
            int userage = 28;
            string username = "Dan";
            // выражение SQL для добавления данных
            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);
                // создаем параметр для имени
                SqliteParameter nameParam = new SqliteParameter("@name", username);
                // добавляем параметр к команде
                command.Parameters.Add(nameParam);
                // создаем параметр для возраста
                SqliteParameter ageParam = new SqliteParameter("@age", userage);
                // добавляем параметр к команде
                command.Parameters.Add(ageParam);

                int number = command.ExecuteNonQuery();
                Console.WriteLine($"Добавлено объектов: {number}");

                // вывод данных
                command.CommandText = "SELECT * FROM Users";
                using (SqliteDataReader reader = command.ExecuteReader())
                {
                    if (reader.HasRows) // если есть данные
                    {
                        while (reader.Read())   // построчно считываем данные
                        {
                            int id = reader.GetInt32(0);
                            string name = reader.GetString(1);
                            int age = reader.GetInt32(2);

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

В данном случае в конструктор передается название параметра и его значение. Причем название параметров начинается со знака @ и должно совпадать с тем названием, которое используется в sql-выражении:

string sqlExpression = "INSERT INTO Users (Name, Age) VALUES (@name, @age)";

После определения параметра он добавляется в коллекцию параметров команды.

SqliteParameter nameParam = new SqliteParameter("@name", username);
command.Parameters.Add(nameParam);

При выполнении команды на место параметров в sql-выражении подставляются их значения.

Результат работы программы:

Добавлено объектов: 1

Id	Name 	Age
2	Alice	32
3	Bob		28
4	Sam		36
5	Dan		28

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

Установка для параметра типа и размера

С помощью дополнительных конструкторов и свойств класса SqliteParameter можно дополнительно определить тип и размер параметра.

Для описания типа параметра используется перечисление SqliteType, которое определяет всего четыре значения:

  • SqliteType.Integer

  • SqliteType.Real

  • SqliteType.Text

  • SqliteType.Blob

Эти значения соответствуют соответствующим типам данных SQLite.

Например, зададим для параметра тип и размер:

using System;
using Microsoft.Data.Sqlite;

namespace HelloApp
{
    class Program
    {
        static void Main(string[] args)
        {
            // данные для добавления
            int userage = 23;
            string username = "Daniel";
            // выражение SQL для добавления данных
            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);
                // создаем параметр для имени
                SqliteParameter nameParam = new SqliteParameter("@name", SqliteType.Text, 4);
                // определяем значение
                nameParam.Value = username;
                // также можно определить тип и размер через свойства
                // nameParam.SqliteType = SqliteType.Text;
                // nameParam.Size = 3;
                // добавляем параметр к команде
                command.Parameters.Add(nameParam);
                // создаем параметр для возраста
                SqliteParameter ageParam = new SqliteParameter("@age", userage);
                // добавляем параметр к команде
                command.Parameters.Add(ageParam);

                int number = command.ExecuteNonQuery();
                Console.WriteLine($"Добавлено объектов: {number}");

                // вывод данных
                command.CommandText = "SELECT * FROM Users";
                using (SqliteDataReader reader = command.ExecuteReader())
                {
                    if (reader.HasRows) // если есть данные
                    {
                        while (reader.Read())   // построчно считываем данные
                        {
                            int id = reader.GetInt32(0);
                            string name = reader.GetString(1);
                            int age = reader.GetInt32(2);

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

В данном случае параметр nameParam имеет тип SqliteType.TEXT и длину в 4 символа. Поэтому, несмотря на то, что на сохранение в базу данных этому параметру передается строка "Daniel", из-за ограничения по длине она будет усечена до 4 символов.

Результат работы программы:

Добавлено объектов: 1

Id	Name 	Age
2	Alice	32
3	Bob		28
4	Sam		36
5	Dan		28
6	Dani	23
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850