OracleDataClientBatchingBatcherFactory引发Null引用异常
本文关键字:异常 引用 Null 引发 OracleDataClientBatchingBatcherFactory | 更新日期: 2023-09-27 18:24:26
我们使用的是NHibernate 4.0.4.4000版本,并使用FluentHibernate 2.0.3.0版本进行配置。
我正在尝试使用Oracle Data Client batching Batcher Factory(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属性。此方法引发一个null引用异常。
其他人也遇到过同样的问题吗?我是遗漏了什么,还是OracleDataClientBatchingBatcher中的错误?
当我使用SQL Client Batching Batcher Factory(SqlClientBatchingBatcherFactory)时,我不会遇到这个问题
var cfg = new NHibernate.Cfg.Configuration().DataBaseIntegration(prop => {
prop.BatchSize = 1000;
prop.Batcher<SqlClientBatchingBatcherFactory>();
});
任何帮助都将不胜感激,因为这目前正在阻止我们。
问题来源:https://groups.google.com/forum/#%21topic/nhusers/-rzStjZSxmI
花了几个小时,我发现问题的根本原因是OracleDataClientBatchingBatcher
与nHibernate支持的所有Oracle连接驱动程序不兼容。在我的案例中,它是NHibernate.Driver.OracleClientDriver,它实际上是System.Data.OracleClient.Connection
和System.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>安装软件包Oracle.ManagedDataAccess
这种方法非常适合我