SQLite ExecuteReader → DataTable.Load → FormatException (DateTime)

Я попытался зачитать образец базы данных sqlite Northwind, но получить ошибку в некоторых таблицах с датой. Это проблема базы данных или моего System.Data.SQLite? Исключение выглядит примерно так: "строка недействительна DateTime"

http://system.data.sqlite.org/

В курсе я могу самостоятельно считывать данные с правильным преобразованием даты и времени, но это не так хорошо, как чтение его через простой dt.Load()

        SQLiteCommand dbCommand = myConnector.CreateCommand();
        dbCommand.CommandText = "SELECT * FROM " + tablename;

        SQLiteDataReader executeReader = dbCommand.ExecuteReader(CommandBehavior.SingleResult);
        DataTable dt = new DataTable();
        dt.Load(executeReader); // <-- FormatException

"bei System.DateTimeParse.ParseExactMultiple(String s, String [] форматы, DateTimeFormatInfo dtfi, стиль DateTimeStyles)\r\n bei System.DateTime.ParseExact(String s, String [], IFormatProvider провайдер, стиль DateTimeStyles)\r\n bei System.Data.SQLite.SQLiteConvert.ToDateTime(String dateText, Формат SQLiteDateFormats, тип DateTimeKind) в C:\DEV\SQLite\DotNet\System.Data.SQLite\SQLiteConvert.cs: Зейль 322".

Мне нужна хорошая помощь для улучшения текущего кода.

Ответы

Ответ 1

Да, я столкнулся с той же проблемой, и я нашел решение.

Прежде всего, вам нужно знать, почему это происходит.

http://www.sqlite.org/datatype3.html

**

В SQLite отсутствует класс хранения, зарезервированный для хранения дат и/или раз. Вместо этого встроенные функции даты и времени SQLite могут хранить даты и время как TEXT, REAL или INTEGER значения:

**

TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC. 

Приложения могут выбрать сохранение дат и времени в любом из этих форматы и свободно конвертировать между форматами с использованием встроенной даты и функции времени.

Для получения дополнительных функций даты и времени вы можете увидеть эту страницу: http://www.sqlite.org/lang_datefunc.html

РЕШЕНИЕ:

Просто используйте функцию datetime, чтобы преобразовать ваше поле в допустимый формат данных .NET. Вы можете использовать любого из вышеуказанной ссылки, в моем случае я выбираю:

SELECT datetime(field) as field FROM table

СОВЕТ 1 Если ваш запрос находится в режиме просмотра, и вы не можете коснуться своего дБ, создать другое представление или что-то в этом роде, у вас небольшие проблемы, потому что проблема на стороне db, как я объяснял ранее. Таким образом, первое решение заменяет столбец datatable перед загрузкой (небольшая грязная работа). Или вы можете использовать штамп Unix в текстовом поле или любую желаемую временную метку. Но я думаю, что лучшим решением является создание вашего запроса в приложении с вашего вида:

SELECT datetime(field) as field FROM view

СОВЕТ 2

Вы можете попробовать также с администратором SQLite и играть с функциями datetime, прежде чем проверять формат.

СОВЕТ 3

Помните о своей глобализации культуры, вы можете найти проблему, если вы измените культуру. Постарайтесь выполнить свою мягкую работу только с одним и отобразить ее так, как хотите, а не по желанию культуры. В моей стране, например, мы используем этот общий формат: dd/MM/yy и боль, как точка в десятичных числах (мы используем запятую)

СОВЕТ 4

Если вы работаете с определённым мастером соединением в каком-либо отчете или сущности или что-то вроде этого, обязательно проверьте желаемый формат конверсии. Например, я использую наиболее распространенный и не проблематичный способ: ISO8601

SQLite - Add Connection

Ответ 2

Пробовал ли вы с SQLiteDataAdapter так.

SQLiteDataAdapter da = new SQLiteDataAdapter(dbCommand);
da.Fill(dt);

Скорее всего, он ведет себя одинаково, но не мешает попробовать;)