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

时间:2014-04-02 18:55:38

标签: c# .net nhibernate fluent-nhibernate

我使用Fluent NHibernate访问IBM DB2400 iSeries数据库。总的来说,这很好。我不得不创建几种自定义数据类型,因为并非每个iSeries数据类型都完全映射到C#.NET中的某些内容(并且因为数据库设计者有时决定将日期存储在字符串或int字段中,但这并不是也没有)。总的来说,这些也很好。

我的问题是我在iSeries上处理TIME数据类型的自定义类型。我可以从中读取它并将我得到的内容转换为DateTime对象。我甚至可以写信给它...有时候。上午10点之后的任何时间都可以正常工作,这是问题所在的12:00-09:59。

经过大量测试后,我发现Fluent NHibernate将TIME数据类型视为int,并且写入该字段的值必须为HH0mm0ss格式才能正确检测。我不知道为什么它需要那些零,但确实如此。它跳过这些数字,所以如果你不使用它们,122153的输入读取为12:15:30,122538将被拒绝作为输入错误,因为12:53:80不是有效时间。 / p>

我所能处理的一切。问题是,由于Fluent NHibernate将TIME视为int,它丢弃任何前导零。如果它是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尝试转换你提供的任何东西" value"自动转换为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);
        }
}

1 个答案:

答案 0 :(得分:0)

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

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

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