Чтение эпохи Unix из базы данных SQLite с помощью ADO. NET System.Data.SQLite - PullRequest
0 голосов
/ 10 июля 2020

Пока я читаю полную таблицу данных с помощью метода Fill () из SQLiteDataAdapter , я получаю исключение «Строка не распознается как допустимая дата и время».

Исключение генерируется при чтении столбца типа DATETIME NOT NULL, который содержит Unix отметки времени эпохи в миллисекундах. И да, я знаю, что в SQLite нет определенного типа c DateTime. Я знаю (из sqlite, выбрасывающего строку «Строка не распознается как действительное datetime» ), что я могу адаптировать ConnectionString и установить «DateTimeFormat = UnixEpoch».
Но этот параметр интерпретирует значение как секунды не миллисекунд с 1 января 1970 года.
Все равно его использование приводит к ArgumentOutOfRangeException. Для строки подключения есть еще один параметр: DateTimeFormatString. Но я не вижу возможности использовать его с моим форматом.

Я не могу изменить данные в таблице. И я также не хочу перечислять столбцы вручную. Есть ли простой способ заполнить таблицу "select * from ..."? Также было бы полезно просто читать его как строку. Существует обходной путь с «DateTimeFormat = Ticks», но это уродливое решение, потому что оно не основано на 1 января 1970 года.

Любая помощь будет принята с благодарностью.

С уважением

Я сократил свой код до минималистичного c примера, чтобы продемонстрировать поведение.

using System.Data;
using System.Data.SQLite;

namespace SQLite
{
    public class Program
    {
        public static void Main()
        {
            //using (var connection = new SQLiteConnection(@"Data Source=d:\src\C#\SQLite\SQLite\db\sampledb.db; DateTimeFormat=Ticks;"))
            using (var connection = new SQLiteConnection(@"Data Source=d:\src\C#\SQLite\SQLite\db\sampledb.db; DateTimeFormat=UnixEpoch;"))
            {
                connection.Open();
                using (var sqlDataAdapter = new SQLiteDataAdapter("SELECT * FROM TimeStamps;", connection))
                {
                    var dataTable = new DataTable();
                    sqlDataAdapter.Fill(dataTable);
                }
            }
        }
    }
}

Кроме того, теперь БД содержит только одну таблицу. Обе даты, т.е. 1586948400000, относятся к 2020 году.
Таблица в образце БД

Приведенный выше код дает ArgumentOutOfRangeException. Если код выполняется с DateTimeFormat=Ticks в ConnectionString, он запускается, но создает неправильные календарные даты.

Таблица была создана с этим SQL:

CREATE TABLE "TimeStamps" (
    "Id"    INTEGER,
    "TimeStamps"    DATETIME,
    PRIMARY KEY("Id")
)
...