0

我在使用 NHibernate 时遇到问题,在服务器上运行的语句在尝试使用DateTime参数时失败。

参数被传递为'2012-04-15 19:52:55.7230000',但它的精度太高,无法转换为datetime

exec sp_executesql N'
    INSERT INTO [People].[NameChanges]
     (
        Revision, 
        MadeAtDateTime,
        MadeAtOffset,
        MadeBy,
        Title,
        Forename,
        Surname,
        Person,
        ID
    ) 
    VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8)',
    N'@p0 int,
      @p1 datetime,
      @p2 bigint,
      @p3 nvarchar(4000),
      @p4 nvarchar(4000),
      @p5 nvarchar(4000),
      @p6 nvarchar(4000),
      @p7 bigint,
      @p8 uniqueidentifier',

     @p0=0,
     @p1='2012-04-15 19:52:55.7230000',
     @p2=36000000000,
     @p3=N'',
     @p4=N'Mr',
     @p5=N'Ezra',
     @p6=N'Awesomesauce',
     @p7=1969929945,
     @p8='4D045A70-A474-4D36-8841-DDB16BBB147D'

消息 8114,第 16 级,状态 5,第 0 行

将数据类型 varchar 转换为日期时间时出错。

为了确认问题,我运行了以下语句:

declare @DateTime datetime = '2012-04-15 19:52:55.7230000'

并收到消息:

消息 241,第 16 级,状态 1,第 1 行

从字符串转换日期和/或时间时转换失败。

我在 SQL 2008 Express 数据库上运行,但我需要架构与 SQL 2005 兼容,因此这排除了切换到datetime2数据类型的选项作为一种简单的解决方法。

感觉格式化比 NHibernate 更多地是 SQL ADO.NET 驱动程序的一部分,但是我对 NHibernate 如何生成语句以更精确地询问我需要去哪里将格式更改为数据库可以解析的内容知之甚少.

理想情况下,我想使用 ISO 8601 或继续使用 ANSI SQL 格式以避免任何与文化相关的问题。

我能做些什么来纠正这个问题?

4

1 回答 1

2

NHibernate 的DateTime值格式由其内部类型系统通过IType接口控制。

在我的场景中,NHibernate 决定可序列化类型DateTimeDbTimestamp. 此类型包含比 SQL Server 数据类型中本机可用的更高程度的精度datetime,因此在尝试将字符串转换为datetime.

解决方案是显式设置自定义类型以使用 NHibernate 的Type.DateTime类型,它只包括到秒的时间,并且适合该datetime类型。

于 2012-04-16T11:18:23.957 回答