Получение скалярных значений в SQLite

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

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 или другому числовому типу и использовать как числовые данные.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850