[英]OracleDataClientBatchingBatcherFactory Throws Null Reference Exception
我们正在使用NHibernate 4.0.4.4000版,并使用FluentNHibernate 2.0.3.0版对其进行配置。
我试图在与Oracle数据客户端批处理批处理程序工厂(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
花了一个小时,我发现问题的根本原因是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
这种方法对我来说是完美的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.