Fluent NHibernate 无法将 DB2400 上的时间列设置为上午 10 点之前的值
本文关键字:设置 时间 NHibernate Fluent DB2400 | 更新日期: 2023-09-27 17:56:19
我使用 Fluent NHibernate 访问 IBM DB2400 iSeries 数据库。总的来说,这工作正常。我不得不创建几种自定义数据类型,因为并非每个 iSeries 数据类型都完全映射到 C# .NET 中的某些内容(还因为数据库设计人员有时决定将日期存储在字符串或 int 字段中,但这既不在这里也不在那里)。总的来说,这些也工作正常。
我的问题是我为处理iSeries上的TIME数据类型而创建的自定义类型。我可以很好地从中读取并将我得到的内容转换为 DateTime 对象。我什至可以写信给它...有时。上午 10 点之后的任何时间都可以正常工作,这就是问题所在 12:00-09:59。
经过广泛的测试,我发现Fluent NHibernate将TIME数据类型视为整数,并且写入字段的值必须采用HH0mm0ss格式才能正确检测。我不知道为什么它需要这些零,但它确实需要。它会跳过这些数字,因此如果您不使用它们,122153的输入将被读取为 12:15:30,而 122538 将作为错误输入被拒绝,因为 12:53:80 不是有效时间。
我能处理的一切。问题在于,由于Fluent NHibernate将TIME视为整数,因此它丢弃了任何前导零。如果是 5:17,我05017023传递,它显示为 50:70:30。显然,这是一个问题,我似乎找不到解决方法。如果有人以前遇到过这种情况或有任何想法,我都会听到。
下面是自定义数据类型中的相关代码:
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
if (value == null)
{
NHibernateUtil.String.NullSafeSet(cmd, null, index);
return;
}
value = ((DateTime)value).ToString("HH0mm0ss"); //no I don't know why we need those zeroes there, but we do. Because ISeries I guess
NHibernateUtil.String.NullSafeSet(cmd, value, index);
}
它使用字符串而不是整数,因为 Fluent NHibernate 尝试将您在"值"中赋予它的任何内容自动转换为 int,所以我只需要自己打扰该步骤。
下面是其中一个具有 TIME 类型字段的表中的地图:
public class PPFP01067Map : ClassMap<PPFP01067>
{
public PPFP01067Map()
{
Table("PPFP01067");
Id(x => x.PMACCT);
Map(x => x.PMHOME);
Map(x => x.PMCELL);
Map(x => x.PMTEXT).Length(1);
Map(x => x.PMWORK);
Map(x => x.PMPREF).Length(1);
Map(x => x.PMDATE).CustomType<Db2DateType>();
Map(x => x.PMTIME).CustomType<Db2TimeType>();
Map(x => x.PMAUTH).Length(5);
}
}
我找到了答案。我找错了地方;关键线索是代码认为 TIME 是一个 int 字段。我在自定义类型代码中查看了更深入的内容,发现:
public SqlType[] SqlTypes
{
get
{
SqlType[] types = new SqlType[1];
types[0] = new SqlType(DbType.Int32);
return types;
}
}
我所要做的就是将其更改为DbType.DateTime,它工作正常。