OracleDataClientBatchingBatcherFactory引发空引用异常

时间:2015-11-25 15:02:22

标签: c# oracle nhibernate fluent-nhibernate batching

我们正在使用NHibernate版本4.0.4.4000并使用FluentNHibernate版本2.0.3.0进行配置。

我正在尝试使用Oracle Data Client批处理批处理工厂(OracleDataClientBatchingBatcherFactory)在Oracle连接上设置批处理,并使用以下代码创建NHConfiguration:

var cfg = new NHibernate.Cfg.Configuration().DataBaseIntegration(prop => {
        prop.BatchSize = 1000;
        prop.Batcher<OracleDataClientBatchingBatcherFactory>();
    });

在会话刷新时获得以下异常:

System.NullReferenceException: Object reference not set to an instance of an object.
   at NHibernate.AdoNet.OracleDataClientBatchingBatcher.SetArrayBindCount(Int32 arraySize)
   at NHibernate.AdoNet.OracleDataClientBatchingBatcher.DoExecuteBatch(IDbCommand ps) ...

看起来SetArrayBindCount方法正在使用反射在OracleCommand中设置ArrayBindCount属性。此方法抛出空引用异常。

其他人是否遇到过同样的问题?我错过了什么,或者是OracleDataClientBatchingBatcher中的错误?

使用SQL客户端批处理批处理工厂(SqlClientBatchingBatcherFactory)时,我没有遇到此问题

var cfg = new NHibernate.Cfg.Configuration().DataBaseIntegration(prop => {
        prop.BatchSize = 1000;
        prop.Batcher<SqlClientBatchingBatcherFactory>();
    });

任何帮助将不胜感激,因为这目前阻碍了我们。

问题来源:https://groups.google.com/forum/#%21topic/nhusers/-rzStjZSxmI

1 个答案:

答案 0 :(得分:3)

花了一个小时我发现问题的根本原因是OracleDataClientBatchingBatcher与nHibernate支持的所有Oracle连接驱动程序不兼容。在我的例子中,它是 NHibernate.Driver.OracleClientDriver ,它实际上是System.Data.OracleClient.ConnectionSystem.Data.OracleClient.OracleCommand的包装器。

public OracleClientDriver() :
        base(
        "System.Data.OracleClient",
        "System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 
        "System.Data.OracleClient.OracleConnection", 
        "System.Data.OracleClient.OracleCommand") { }

如果你检查OracleCommand类,你会发现它实际上并没有包含属性'ArrayBindCount'。除此之外,MSDN还告诉我们不推荐使用System.Data.OracleClient命名空间中的类:

  

不推荐使用System.Data.OracleClient中的此类型,并且将在.NET Framework的未来版本中将其删除。有关更多信息,请参阅Oracle和ADO.NET。

要解决此问题,您必须选择 NHibernate.Driver.OracleManagedDataClientDriver 作为使用Oracle ADO.NET的连接驱动程序。以下是nHibernate配置文件的一部分:

<property name="connection.provider">
    NHibernate.Connection.DriverConnectionProvider
</property>
<property name="connection.driver_class">
    NHibernate.Driver.OracleManagedDataClientDriver
</property>
<property name="dialect">
    NHibernate.Dialect.Oracle10gDialect
</property> 

此外,您还需要从NuGet

安装Oracle.ManagedDataAccess包
  

PM&GT;安装包Oracle.ManagedDataAccess

这种方法对我来说非常有效