Неправильный DateTime при добавлении в БД SQLite через (Свободно) NHibernate - PullRequest
6 голосов
/ 26 февраля 2010

У меня есть компонент, который я хочу сохранить в базе данных SQLite.

public class Comp : Entity
{
    public virtual DateTime TimeStamp { get; set; }
    public virtual String Name { get; set; }
}

public class CompMap : ClassMap<Comp>
{
    public CompMap()
    {
        Id(x => x.Id);
        Map(x => x.TimeStamp);
        Map(x => x.Name);
    }
}

Ничего особенного на самом деле.

Проблема в том, что TimeStamp неправильно хранится в БД (SQLite-Explorer показывает значение «30 -12-1899») Я думаю, что это как-то связано с тем, как nHibernate отправляет DateTime в базу данных

NHibernate: INSERT INTO "Comp" (TimeStamp, Name) VALUES (@p0, @p1); select last_insert_rowid(); @p0 = 26.02.2010 10:08:09, @p1 = 'test1'

Мне кажется, что DateTime в строковом формате (хотя это может быть просто команда .ShowSQL()), а SQLite не может обработать формат (это немецкое форматирование даты и времени) Я попытался изменить формат, используя IUserType, но результат остался прежним.

Я не нашел никого другого с такой проблемой, поэтому я предполагаю, что проблема в моем коде, но я не могу ее найти.

Вот тестовый код, который я использую для инициализации БД и вставки значения в БД

using System;
using System.IO;
using ConsoleApplication1.db;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var sessionFactory = Fluently.Configure().Database(SQLiteConfiguration.Standard.UsingFile("test.db").ShowSql())
                    .Mappings(m => m.FluentMappings.AddFromAssembly(typeof(Comp).Assembly))
                    .ExposeConfiguration(config =>
                                             {
                                                 if (File.Exists("test.db"))
                                                 {
                                                     File.Delete("test.db");
                                                 }
                                                 new SchemaExport(config)
                                                   .Create(false, true);                                                 
                                             })
                    .BuildSessionFactory(); 
            var session = sessionFactory.OpenSession();
            var ts = DateTime.Now;
            Comp c = new Comp
                         {
                             Name = "test1",
                             TimeStamp = ts
                         };
            session.Save(c);
            session.Flush();
            session.Close();
        }
    }
}

При выполнении этой команды и проверке содержимого БД метка времени не имеет текущей даты / времени, но 1899-31-12

Ответы [ 3 ]

2 голосов
/ 26 февраля 2010

Оказывается, это действительно была моя вина плюс глубокий недостаток двойной проверки. Я записал дату и время в базу данных, а затем проверил значение в базе данных с помощью sqlite explorer . Очевидно, что у кого-то есть проблемы с полями DateTime, и он отображает неверное значение.

Это, плюс в оригинальной программе была ошибка (DateTime был написан неправильно).

Мой вывод: не используйте sqlite explorer

LinqPad правильно отображал значение и, следовательно, будет использоваться с этого момента.

1 голос
/ 26 февраля 2010

Вы пытались изменить культуру текущего потока на что-то другое? InvariantCulture? Если это будет соответствовать языку, который может привести к более удобному формату?

0 голосов
/ 26 февраля 2010

Знаете ли вы, какой тип вашей TimeStamp в базе данных? Sqlite не имеет определенного типа DateTime и может хранить их как текст, реал или целые числа. Я не знаю, как это сделать, но можете ли вы как-то указать тип столбца для TimeStamp в виде текста.

Если бы вы запустили этот sql в своей базе данных, что бы вы получили, т.е.

INSERT INTO "Comp" (TimeStamp, Name) VALUES (26.02.2010 10:08:09, 'test1');

И что тогда вы получите, если запустите это:

INSERT INTO "Comp" (TimeStamp, Name) VALUES ('26 .02.2010 10:08:09 ',' test1 ');

Это может зависеть от определения столбца относительно того, работает ли более поздняя версия или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...