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);
        }
}

Fluent NHibernate 无法将 DB2400 上的时间列设置为上午 10 点之前的值

我找到了答案。我找错了地方;关键线索是代码认为 TIME 是一个 int 字段。我在自定义类型代码中查看了更深入的内容,发现:

public SqlType[] SqlTypes
{
    get
    {
        SqlType[] types = new SqlType[1];
        types[0] = new SqlType(DbType.Int32);
        return types;
    }
}

我所要做的就是将其更改为DbType.DateTime,它工作正常。