Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Nhibernate将oracle十进制日期映射到datetime属性_C#_Oracle_Nhibernate - Fatal编程技术网

C# 如何使用Nhibernate将oracle十进制日期映射到datetime属性

C# 如何使用Nhibernate将oracle十进制日期映射到datetime属性,c#,oracle,nhibernate,C#,Oracle,Nhibernate,我正在使用oracle遗留数据库。 所有日期都保存在十进制字段中,格式为YYYYMMDD。 有没有办法在datetime c中转换这种类型,可能是在映射文件中?最近,我遇到了同样的问题,最后编写了以下方法: public static DateTime? ConvertFromOracleDate(object oracleDate) { if (oracleDate == null) throw new ArgumentNullExcep

我正在使用oracle遗留数据库。 所有日期都保存在十进制字段中,格式为YYYYMMDD。
有没有办法在datetime c中转换这种类型,可能是在映射文件中?

最近,我遇到了同样的问题,最后编写了以下方法:

    public static DateTime? ConvertFromOracleDate(object oracleDate)
    {
        if (oracleDate == null)
            throw new ArgumentNullException("oracleDate");

        if (!(oracleDate is string))
            throw new ArgumentException("oracleDate");  

        var sDate = (string) oracleDate;

        if (sDate.Equals(String.Empty))
            return null;

        if (sDate.Length != 8)
            throw new ArgumentOutOfRangeException("oracleDate");

        sDate = sDate.Insert(6, "/");
        sDate = sDate.Insert(4, "/");
        var ci = new CultureInfo("en-US");

        return Convert.ToDateTime(sDate, ci);
    }

希望这有帮助。

您也可以使用

TO_DATE(TO_CHAR(semi_date_field),'yyyymmdd'))
然后,您将选择一个具有Oracle数据类型DATE的列。毫无疑问,C将这些视为日期时间

问候,, Rob.

只需编写一个自定义IEnhancedUserType,它可以转换为字符串表示形式,也可以转换为字符串表示形式

这样,它将对您的应用程序透明。

最终编写了一个自定义IUserType。 对于那些感兴趣的人,这里是代码。我没有尝试写入过程,因为我的表目前是只读的:

public class DecimalToDateUserType : IUserType
{
    public object NullSafeGet(IDataReader rs, string[] names, object owner)
    {
        int? result = (int)NHibernateUtil.Int32.NullSafeGet(rs, names[0]);
        if ((result != null)&&(result.Value>0))
        {
            var sDate = result.Value.ToString();
            sDate = sDate.Insert(6, "/").Insert(4, "/");
            var ci = new CultureInfo("en-US");

            return Convert.ToDateTime(sDate, ci);
        }
        return (DateTime.MinValue);
    }

    public void NullSafeSet(IDbCommand cmd, object value, int index)
    {
        if (value == null)
        {
            NHibernateUtil.Int32.NullSafeSet(cmd, null, index);
            return;
        }

        if ((DateTime)value == DateTime.MinValue)
        {
            value = 0;
            NHibernateUtil.Int32.NullSafeSet(cmd, value, index);
            return;
        }

        int convertedValue = 0;
        int.TryParse(((DateTime)value).ToString("yyyyMMdd"), out convertedValue);

        value = convertedValue;

        NHibernateUtil.Int32.NullSafeSet(cmd, value, index);
    }

    public object DeepCopy(object value)
    {
        if (value == null) return null;
        return (value);
    }

    public object Replace(object original, object target, object owner)
    {
        return original;
    }

    public object Assemble(object cached, object owner)
    {
        return DeepCopy(cached);
    }

    public object Disassemble(object value)
    {
        return DeepCopy(value);
    }

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

    public Type ReturnedType
    {
        get { return typeof(DateTime); }
    }

    public bool IsMutable
    {
        get { return false; }
    }

    public new bool Equals(object x, object y)
    {
        if (x == null || y == null) return false;
        return x.Equals(y);
    }

    public int GetHashCode(object x)
    {
        return x.GetHashCode();
    }
}

谢谢迭戈,这似乎是我要找的。我将尝试弄清楚它是如何工作的。我没有使用您的解决方案,因为我看到IEnhancedUserType派生自IUserType,而这一个很简单。我已经尝试过这个实现,它可以工作,即使我还不能在编写模式下进行测试。我接受你的解决方案。@LeftyX:是的,事实上,IUserType对于大多数情况都足够了。