.net – 使用Oracle的NHibernate多查询/期货
发布时间:2020-12-12 15:14:24 所属栏目:百科 来源:网络整理
导读:我试图在NHibernate 3.2和Oracle 11gR2中使用期货.虽然我不确定,但这似乎并不支持.我在NHibernate Jira上找到了 this issue,这看起来甲骨文似乎可能有未来.有谁知道如何让期货与Oracle合作? Oracle不受支持的原因究竟是什么? 更新 根据这里的评论,我尝试使
我试图在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("nFORn") .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,"nBEGINn").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); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |