我遇到了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'
Msg 8114,Level 16,State 5,Line 0
将数据类型varchar转换为datetime时出错。
为了确认问题,我运行了以下声明:
declare @DateTime datetime = '2012-04-15 19:52:55.7230000'
收到消息:
Msg 241,Level 16,State 1,Line 1
从字符串转换日期和/或时间时转换失败。
我正在运行SQL 2008 Express数据库,但我需要架构与SQL 2005兼容,因此这样就无法选择切换到datetime2
数据类型作为一种简单的解决方法。
感觉格式化是SQL ADO.NET驱动程序的一部分,而不是NHibernate,但我不知道NHibernate如何生成语句更准确地询问我需要将格式更改为某些内容数据库可以解析。
理想情况下,我想使用ISO 8601或继续使用ANSI SQL格式来避免任何与文化相关的问题。
我该怎么做才能解决这个问题?
答案 0 :(得分:2)
NHibernate的DateTime
值格式由其内部类型系统通过IType
接口控制。
在我的场景中,NHibernate认为DateTime
的可序列化类型是DbTimestamp
。此类型包含比SQL Server的datetime
数据类型中本机可用的更高的精度,因此在尝试将字符串转换为datetime
时会导致溢出。
解决方案是明确设置自定义类型以使用NHibernate的Type.DateTime
类型,该类型仅包括第二个类型的时间,并且适合datetime
类型。