SqliteCommand с помощью специального метода ExecuteScalar() позволяет получать из базы данных скалярный результат, что может быть полезно в различных ситуациях. Например, мы хотим при добавлении нового объекта получить его идентификатор, чтобы потом каким-то образом использовать в программе. И для этого можно как раз применить метод ExecuteScalar():
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 ('Sam', 45); SELECT last_insert_rowid();"; object id = command.ExecuteScalar(); Console.WriteLine($"Идентификатор добавленного объекта {id}"); } Console.Read(); } } }
Для получения идентификатора добавленнего объекта на стороне базы данных применяется встроенная функция last_insert_rowid(). И для ее выполнения в код SQL-запроса добавляет подзапрос "SELECT last_insert_rowid();"
Следует учитывать, что метод ExecuteScalar()
возвращает результат в виде объекта типа object. В данном случае это не имеет большого
значения, так как здесь полученный результат просто выводится на консоль, соответственно значение object автоматически приводится к типу string.
Другим примером применения функции может служить использование специальных встроенные агрегатные функции SQLite, например,
Min, Max, Sum, Count
и т.д., которые не выполняют операции с объектами и не извлекают объекты,
а возвращают какое-то определенное значение. Например, функция Count
подсчитывает количество объектов, а Max
подсчитывает максмальное значение на некотором диапазоне значений.
Например, найдем число всех объектов в таблице, получим минимальный и средний возраст пользователей:
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(); string sqlExpression = "SELECT COUNT(*) FROM Users"; SqliteCommand command = new SqliteCommand(sqlExpression, connection); object count = command.ExecuteScalar(); command.CommandText = "SELECT MIN(Age) FROM Users"; object minAge = command.ExecuteScalar(); command.CommandText = "SELECT AVG(Age) FROM Users"; object avgAge = command.ExecuteScalar(); Console.WriteLine($"В таблице {count} объектa(ов)"); Console.WriteLine($"Минимальный возраст: {minAge}"); Console.WriteLine($"Средний возраст: {avgAge}"); } Console.Read(); } } }
Выражение "SELECT COUNT(*) FROM Users" количество объектов в таблице Users, а выражение "SELECT MIN(Age) FROM Users"
находит минимальное значение столбца Age. Подобным образом выражение "SELECT AVG(Age) FROM Users" получает среднее значение для столбца Age. В качестве результата метод ExecuteScalarAsync()
возвращает объект типа
object
, который затем можно пробразовать к типу int или другому числовому типу и использовать как числовые данные.