用于查询的NHibernate DateTime,由字符串格式引起的溢出异常

时间:2011-02-18 04:44:00

标签: c# nhibernate datetime

NHibernate正在生成Firebird不支持的以下SQL;

where  (struct_cas0_.DELETED IS NULL)
       and struct_cas0_.ACCOUNT_ID = 372 /* @p0 */
       and struct_cas0_.DATE_RECORD <= '2005-01-01T00:00:00.00' /* @p1 */
       and struct_cas0_.DATE_RECORD >= '2006-12-31T00:00:00.00' /* @p2 */

以上SQL在firebird中失败,并显示错误“数据类型转换期间发生溢出。字符串转换错误'2005-01-01T00:00:00.00'”

如果我们从查询中删除'T',Firebird会毫无问题地执行查询;

where  (struct_cas0_.DELETED IS NULL)
       and struct_cas0_.ACCOUNT_ID = 372 /* @p0 */
       and struct_cas0_.DATE_RECORD <= '2005-01-01 00:00:00.00' /* @p1 */
       and struct_cas0_.DATE_RECORD >= '2006-12-31 00:00:00.00' /* @p2 */

在将DateTime转换为可查询字符串时,有没有办法让NHibernate删除'T'?

在一些研究之后,现在又提出了一个额外的问题。似乎FireBird不支持具有时间区分符(“T”)的组合日期和fime格式DateTime格式(ISO8601)http://en.wikipedia.org/wiki/ISO_8601。这可以确认,因为我不明白为什么数据库不能支持这种标准(可排序)日期格式?

如果删除“T”,则支持日期。

3 个答案:

答案 0 :(得分:0)

你确定你有正确的驱动程序等...根据这个问题How do I setup NHibernate with Visual Studio and Firebird?

此外,请确保您在数据库和映射中拥有的数据类型。它们完全一样吗? (例如,都是不可空的?)

否则,它可能是NHibernate本身的一个错误。最好的解决方案是升级到NHibernate 3.0(或更好的offf最新的trunk版本,不用担心,那些通常是稳定的)。如果它仍然是一个bug,那么在那里制作一个JIRA问题,它可以快速修复。

答案 1 :(得分:0)

将DateTime格式化为String。 http://msdn.microsoft.com/en-us/library/az4se3k1(v=VS.100).aspx

另外我认为Nhibernate生成的DateTime格式可能取决于区域设置。尝试更改线程文化。

尝试使用DateTime参数从NHConnection执行纯ADO.NET命令,以检查它是否是FireBird .ADO驱动程序与文化混淆DateTime格式。 ISession.Connection.CreateCommand()

NHibernate应该使用参数化的Ado.net IDbCommand,所以这不是Nhibernate的问题。我不认为Nhibernate会将你的日期时间格式化为字符串中的任何字符串,至少它不应该。

答案 2 :(得分:0)

NHibernate不会将参数转换为字符串;这是ADO.NET提供商的责任。

尝试以下方法:

var connection = new FbConnection(theConnectionString);
var command = connection.CreateCommand();
var parameter = command.CreateParameter();
command.CommandText = "select something from that_table where date_record = @p";
parameter.Name = "p";
parameter.Value = DateTime.Today;
command.Parameters.Add(parameter)
connection.Open();
command.ExecuteReader();

如果失败,那就是你的错误。