Пакет 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