我试图在NHibernate 3.2和Oracle 11gR2中使用期货.虽然我不确定,但这似乎并不支持.我在NHibernate Jira上找到了
this issue,这看起来甲骨文似乎可能有未来.有谁知道如何让期货与Oracle合作? Oracle不受支持的原因究竟是什么?
更新
根据这里的评论,我尝试使用HQL multiquery.我在执行_nhSession.CreateMultiQuery()时遇到异常;这是例外:
- The driver NHibernate.Driver.OracleDataClientDriver does not support multiple queries.
我还能尝试什么?我使用了错误的驱动程序吗?
我想分享一下NHibernate Future查询如何与Oracle协同工作的方式.您可以将以下两个类EnhancedOracleDataClientDriver和EnhancedOracleResultSetsCommand添加到您的项目中,并将NHibernate配置为使用EnhancedOracleDataClientDriver类作为数据库驱动程序.我很感激这种方法是否适用于其他人的反馈.这是上述类的源代码.
EnhancedOracleDataClientDriver.cs
- using NHibernate.Engine;
- namespace NHibernate.Driver
- {
- public class EnhancedOracleDataClientDriver : OracleDataClientDriver
- {
- public override bool SupportsMultipleQueries
- {
- get
- {
- return true;
- }
- }
- public override IResultSetsCommand GetResultSetsCommand(ISessionImplementor session)
- {
- return new EnhancedOracleResultSetsCommand(session);
- }
- }
- }
EnhancedOracleResultSetsCommand.cs
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Linq;
- using System.Reflection;
- using NHibernate.Engine;
- using NHibernate.sqlCommand;
- using NHibernate.sqlTypes;
- using NHibernate.Util;
- namespace NHibernate.Driver
- {
- public class EnhancedOracleResultSetsCommand : BasicResultSetsCommand
- {
- private const string driverAssemblyName = "Oracle.DataAccess";
- private sqlString sqlString = new sqlString();
- private int cursorCount = 0;
- private readonly PropertyInfo oracleDbType;
- private readonly object oracleDbTypeRefCursor;
- public EnhancedOracleResultSetsCommand(ISessionImplementor session)
- : base(session)
- {
- System.Type parameterType = ReflectHelper.TypeFromAssembly("Oracle.DataAccess.Client.OracleParameter",driverAssemblyName,false);
- oracleDbType = parameterType.GetProperty("OracleDbType");
- System.Type oracleDbTypeEnum = ReflectHelper.TypeFromAssembly("Oracle.DataAccess.Client.OracleDbType",false);
- oracleDbTypeRefCursor = System.Enum.Parse(oracleDbTypeEnum,"RefCursor");
- }
- public override void Append(IsqlCommand command)
- {
- Commands.Add(command);
- sqlString = sqlString.Append("\nOPEN :cursor")
- .Append(Convert.ToString(cursorCount++))
- .Append("\nFOR\n")
- .Append(command.Query).Append("\n;\n");
- }
- public override sqlString sql
- {
- get { return sqlString; }
- }
- public override IDataReader GetReader(int? commandTimeout)
- {
- var batcher = Session.Batcher;
- sqlType[] sqlTypes = Commands.SelectMany(c => c.ParameterTypes).ToArray();
- ForEachsqlCommand((sqlLoaderCommand,offset) => sqlLoaderCommand.ResetParametersIndexesForTheCommand(offset));
- sqlString = sqlString.Insert(0,"\nBEGIN\n").Append("\nEND;\n");
- var command = batcher.PrepareQueryCommand(CommandType.Text,sqlString,sqlTypes);
- if (commandTimeout.HasValue) {
- command.CommandTimeout = commandTimeout.Value;
- }
- BindParameters(command);
- for (int cursorIndex = 0; cursorIndex < cursorCount; cursorIndex++) {
- IDbDataParameter outCursor = command.CreateParameter();
- oracleDbType.SetValue(outCursor,oracleDbTypeRefCursor,null);
- outCursor.ParameterName = ":cursor" + Convert.ToString(cursorIndex);
- outCursor.Direction = ParameterDirection.Output;
- command.Parameters.Add(outCursor);
- }
- return new BatcherDataReaderWrapper(batcher,command);
- }
- }
- }