2

我在 Oracle 数据库中有一个表,其中有一列Long类型。在此列中,我们存储了一个长文本,我们无法将类型更改为,CLob因为还有其他系统使用它作为Long类型。我正在编写一个新应用程序来阅读本专栏并使用NHibernateFluent NHibernate映射执行一些任务。

映射没问题,除此列外一切正常。当我从这个表中读取一个实体时,该long列是一个空字符串,如"".

我试过这些:

Map(x => x.Query).Column("PNL_QUERY");

Map(x => x.Query).Column("PNL_QUERY").CustomType("StringClob");

Map(x => x.Query).Column("PNL_QUERY").CustomType("StringClob")
                                     .CustomSqlType("Long");

Map(x => x.Query).Column("PNL_QUERY").CustomType("Long");

没有任何效果。""当我从数据库加载一些实体时,它们都返回到查询字段中。

我如何在 Oracle 中映射这种类型的列?

谢谢你。

4

1 回答 1

3

我找到了一个解决方案:

要使LONG列正常工作,在 ado.net oracle 提供程序中,我们必须将OracleCommand.InitialLONGFetchSize属性设置为-1. 所以我们必须从OracleDataClientDriver类中覆盖 Oracle 驱动程序。像这样的东西:

使用 NHibernate.Driver; 使用 Oracle.DataAccess.Client;

namespace MyProject
{
    public class OracleDriverExtended : OracleDataClientDriver
    {
        public override void AdjustCommand(System.Data.IDbCommand command)
        {
            OracleCommand cmd = command as OracleCommand;
            if (cmd != null)
                cmd.InitialLONGFetchSize = -1;
        }
    }
}

并在hibernate.cfg.xml将此自定义驱动程序设置为connection.driver_class属性:

<property name="connection.driver_class">
   MyProject.Data.OracleDriverExtended,
   MyProject
</property>

LONG现在,NHibernate 可以从 Oracle读取类型。

我在这里找到了解决方案http://sonyarouje.com/2012/11/07/nhibernate-and-oracle-long-varchar-field/

于 2013-09-25T15:03:25.990 回答