Сопоставление типов C# и SQLite. Типизация SqliteDataReader

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

Для получения результатов с помощью класса SqliteDataReader в прошлой теме применялся метод GetValue, который возвращал значение определенного столбца в текущей ячейки в виде объекта типа object. Однако при создании таблицы в одной из прошлых тем использовался следующий скрипт sql:

CREATE TABLE Users(_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, Name TEXT NOT NULL, Age INTEGER NOT NULL)

То есть, мы знаем, что во третьем столбце хранится возраст пользователя, который представляет целое число, и в программе мы хотели бы получать это значение именно как целое число, а не объект типа object. Ведь, поскольку GetValue возвращает объект типа object, то, чтобы использовать значение столбца, к примеру, как число, нам надо его привести к типу int. Но класс SqliteDataReader представляет ряд методов, которые позволяют сразу получить данные определенных типов.

Итак, получим из таблицы Users, которая была создана в прошлых темах, данные с помощью дополнительных методов SqliteDataReader:

using System;
using Microsoft.Data.Sqlite;

namespace HelloApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string sqlExpression = "SELECT * FROM Users";
            using (var connection = new SqliteConnection("Data Source=usersdata.db"))
            {
                connection.Open();

                SqliteCommand command = new SqliteCommand(sqlExpression, connection);
                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();
        }
    }
}

Для получения данных здесь теперь используются методы GetInt32() и GetString(), которые возвращают объекты типа int и string соответственно. Причем поскольку мы знаем, что в столбце _id хранится число, то мы можем получить его именно с помощью метода GetInt32, но никак не GetString. И также в этот метод передается номер столбца в таблице (нумерация опять же начинается с нуля).

Консольный вывод программы:

2		Alice		32		
3		Bob		28		
4		Sam		36		

SQLite имеет только четыре примитивных типа: INTEGER, REAL, TEXT и BLOB. С помощью пакета Microsoft.Data.Sqlite типы данных C# и SQLite сопоставляются следующим образом:

Тип C#

Тип SQLite

bool

INTEGER (0 или 1)

sbyte

INTEGER

byte

INTEGER

byte[]

BLOB

char

TEXT (UTF-8)

DateTime

TEXT (формат yyyy-MM-dd HH:mm:ss.FFFFFFF)

DateTimeOffset

TEXT (формат yyyy-MM-dd HH:mm:ss.FFFFFFF)

TimeSpan

TEXT (формат d.hh:mm:ss.fffffff)

decimal

TEXT (формат 0.0###########################)

float

REAL

double

REAL

Guid

TEXT (формат 00000000-0000-0000-0000-000000000000)

int

INTEGER

short

INTEGER

long

INTEGER

uint

INTEGER

ushort

INTEGER

ulong

INTEGER

string

TEXT

И для получения данных определенного типа данных мы можем применять соответствующий метод класса SqliteDataReader.

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