Dapper: строка не была распознана как действительный DateTime - PullRequest
4 голосов
/ 30 января 2020

Я использую Dapper для доступа к базе данных sqlite и получаю 'String не был распознан как действительный DateTime.'. Любая помощь приветствуется.

// Create table schema
CREATE TABLE "mytable" ( "field1"   TEXT, "field2"  TEXT, "field3"  TEXT, 
                         "field4"   TEXT, "field5"  TEXT, 
                         "field6"   bit, 
                         "field7"   TEXT, "field8"  TEXT, "field9"  TEXT,
                         "field10"  TEXT, 
                         "field11"  DateTime )

Код запроса:

var result= sqliteConnection.Query<TestItem>("Select * from mytable");

Запрос на вставку данных:

INSERT INTO "main"."mytable" ("field1", "field2", "field3", "field4", "field5", "field6", "field7", "field8", "field9", "field10", "field11") VALUES ('750eb223-2993-4d85-9d4f-3e8689e9baa7', 'some value', '', 'some value', 'some value', '1', '84', 'ae35e1e1-dd4c-4e49-a76c-d577f417bf9a', 'some value', 'HOME.aspx', 
                             '2020/01/20 17:38');
INSERT INTO "main"."mytable" ("field1", "field2", "field3", "field4", "field5", "field6", "field7", "field8", "field9", "field10", "field11") VALUES ('750eb223-2993-4d85-9d4f-3e8689e9baa7', 'some value', 'asdf', 'some value', 'some value', '1', '32', 'a1cd1b8f-95f6-4b03-8d54-f904c21749ac', 'HOME.aspx', 'HOME.aspx', 
                              '2020/01/20 17:38');
INSERT INTO "main"."mytable" ("field1", "field2", "field3", "field4", "field5", "field6", "field7", "field8", "field9", "field10", "field11") VALUES ('750eb223-2993-4d85-9d4f-3e8689e9baa7', 'some value', 'some value', 'some value', 'some value', '1', '99', 'b9e63bfd-c73e-4e9a-b3e7-30ae49d8a002', 'CALLSS.aspx', 'CALLSS.aspx', 
                              '2020/01/20 17:38');

Сообщение об ошибке:

Error parsing column 10 (field11=HOME.aspx - String)

Внутреннее сообщение об исключении:

String was not recognized as a valid DateTime.

StackTrace:

at Dapper.SqlMapper.ThrowDataException(Exception ex, Int32 index, IDataReader reader, Object value) in C:\projects\dapper\Dapper\SqlMapper.cs:line 3609
   at Dapper.SqlMapper.<QueryImpl>d__138`1.MoveNext() in C:\projects\dapper\Dapper\SqlMapper.cs:line 1100
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in C:\projects\dapper\Dapper\SqlMapper.cs:line 723
   at Tzunami.LinkResolver.DatabaseMigration.Models.DBMigrator.<MigrateDeploymentListItemAsync>d__5.MoveNext() in C:\Users\surendra\source\repos\Tzunami.LinkResolver.MigrationTool\Tzunami.LinkResolver.DatabaseMigration\Models\DBMigrator.cs:line 77

Класс элемента сопоставления:

public class TestItem
{
  public string Field1 { get; set; }
  public string Field2 { get; set; }
  public string Field3 { get; set; }
  public string Field4 { get; set; }
  public string Field5 { get; set; }
  public string Field6 { get; set; }
  public string Field7 { get; set; }
  public string Field8 { get; set; }
  public string Field9 { get; set; }
  public string Field10 { get; set; }
  public string Field11 { get; set; }
}

Схему и записи базы данных можно увидеть из следующего примера, взятого из БД SQLite browser enter image description here

enter image description here

Ответы [ 3 ]

2 голосов
/ 30 января 2020

Я никогда не использовал SQLite, но согласно документу , SQLite не имеет типа данных для хранения DateTime.

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

  • TEXT в виде строк ISO8601 ("YYYY-MM-DD HH: MM: SS.SSS ").
  • REAL в виде юлианских чисел, числа дней, прошедших с полудня в Гринвиче 24 ноября, 4714 B. C. в соответствии с prolepti c Григорианский календарь.
  • INTEGER как Unix Время, количество секунд с 1970-01-01 00:00:00 UT C.

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

Учитывая вышеизложенный формат даты в следующем коде:

INSERT INTO "main"."mytable" (..., "field11") VALUES (..., '2020/01/20 17:38');

должно быть

ГГГГ-ММ-ДД ЧЧ: ММ: СС.ССС

Таким образом, вам не нужно менять схему базы данных; просто изменение в вашем коде.

2 голосов
/ 30 января 2020

Во-первых: имейте в виду, что, как упомянуто в документации Sqlite, Datatypes как DateTime не сохраняется как текст или несколько цифр, так что лучше сохранять даты в виде простого текста при создании БД. Документация здесь: https://www.sqlite.org/datatype3.html

Во-вторых: ожидается, что DateTime будет в формате ISO8601, то есть в формате «ГГГГ-ММ-ДД ЧЧ: ММ: СС.SSS», но в виде данных таблицы это «ГГГГ-ММ-ДД ЧЧ: ММ», его нельзя проанализировать как DateTime.

Обходной путь:

Поскольку вы не можете изменить схему и данные БД, connection.ExecuteReader очень хорошо работает в этих условиях, поэтому используйте connection.ExecuteReader и для получения столбца значение в качестве строки использовать reader.GetString() Метод.

0 голосов
/ 30 января 2020

Попробуйте использовать этот формат как строку.

'2007-01-01 10: 00: 00'

т.е. гггг-мм-дд ЧЧ: мм: сс

...