OracleDataClientBatchingBatcherFactory 抛出空引用异常
OracleDataClientBatchingBatcherFactory Throws Null Reference Exception
我们使用的是 NHibernate 版本 4.0.4.4000 并使用 FluentNHibernate 版本 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 属性。该方法抛出空引用异常。
有没有其他人遇到同样的问题?我是不是遗漏了什么或者是 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 class,您会发现它实际上并不包含 属性 'ArrayBindCount'。除了这个 MSDN 告诉 classes from System.Data.OracleClient namespace are deprecated:
This types in System.Data.OracleClient are deprecated and will be removed in a future version of the .NET Framework. For more information, see Oracle and 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> Install-Package Oracle.ManagedDataAccess
这种方法非常适合我
我们使用的是 NHibernate 版本 4.0.4.4000 并使用 FluentNHibernate 版本 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 属性。该方法抛出空引用异常。
有没有其他人遇到同样的问题?我是不是遗漏了什么或者是 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 class,您会发现它实际上并不包含 属性 'ArrayBindCount'。除了这个 MSDN 告诉 classes from System.Data.OracleClient namespace are deprecated:
This types in System.Data.OracleClient are deprecated and will be removed in a future version of the .NET Framework. For more information, see Oracle and 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> Install-Package Oracle.ManagedDataAccess
这种方法非常适合我