【问题标题】:DateTime incorrect when added to SQLite DB through (Fluent)NHibernate通过 (Fluent)NHibernate 添加到 SQLite DB 时 DateTime 不正确
【发布时间】:2011-01-21 09:18:44
【问题描述】:

我有一个想要存储到 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();
        }
    }
}

执行此命令并检查数据库内容时,TimeStamp 没有当前日期/时间,而是 1899-31-12

【问题讨论】:

    标签: c# nhibernate sqlite fluent-nhibernate


    【解决方案1】:

    事实证明,这确实是我的错,加上严重缺乏双重检查。 我确实将日期时间写入数据库,然后使用sqlite explorer 检查数据库中的值。显然,一个日期时间字段存在问题并且确实显示了不正确的值。

    那个,加上原来的程序确实有一个错误(日期时间没有正确编写)。

    我的结论是:不要使用 sqlite explorer

    LinqPad 确实正确显示了该值,因此将从现在开始使用。

    【讨论】:

    • SQlite 开发人员遇到了同样的问题,我只是浪费了 20 分钟的时间试图弄清楚
    【解决方案2】:

    您是否尝试将当前线程的文化更改为其他内容?不变文化?如果这会尊重可能导致更可用格式的语言环境?

    【讨论】:

    • 好点。我刚试过。它将输出更改为NHibernate: INSERT INTO "Comp" (TimeStamp, Name) VALUES (@p0, @p1); select last_insert_rowid();@p0 = 02/26/2010 11:16:57, @p1 = 'test1' 遗憾的是数据库内容根本没有改变(仍然是错误的日期时间)。
    【解决方案3】:

    你知道你的时间戳在数据库中是什么类型吗? 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');

    后者是否有效可能取决于列定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多