.net – 使用Oracle的NHibernate多查询/期货

前端之家收集整理的这篇文章主要介绍了.net – 使用Oracle的NHibernate多查询/期货前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在NHibernate 3.2和Oracle 11gR2中使用期货.虽然我不确定,但这似乎并不支持.我在NHibernate Jira上找到了 this issue,这看起来甲骨文似乎可能有未来.有谁知道如何让期货与Oracle合作? Oracle不受支持的原因究竟是什么?

更新

根据这里的评论,我尝试使用HQL multiquery.我在执行_nhSession.CreateMultiQuery()时遇到异常;这是例外:

  1. The driver NHibernate.Driver.OracleDataClientDriver does not support multiple queries.

我还能尝试什么?我使用了错误的驱动程序吗?

我想分享一下NHibernate Future查询如何与Oracle协同工作的方式.您可以将以下两个类EnhancedOracleDataClientDriver和EnhancedOracleResultSetsCommand添加到您的项目中,并将NHibernate配置为使用EnhancedOracleDataClientDriver类作为数据库驱动程序.我很感激这种方法是否适用于其他人的反馈.这是上述类的源代码.

EnhancedOracleDataClientDriver.cs

  1. using NHibernate.Engine;
  2.  
  3. namespace NHibernate.Driver
  4. {
  5. public class EnhancedOracleDataClientDriver : OracleDataClientDriver
  6. {
  7. public override bool SupportsMultipleQueries
  8. {
  9. get
  10. {
  11. return true;
  12. }
  13. }
  14.  
  15. public override IResultSetsCommand GetResultSetsCommand(ISessionImplementor session)
  16. {
  17. return new EnhancedOracleResultSetsCommand(session);
  18. }
  19. }
  20. }

EnhancedOracleResultSetsCommand.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Reflection;
  6. using NHibernate.Engine;
  7. using NHibernate.sqlCommand;
  8. using NHibernate.sqlTypes;
  9. using NHibernate.Util;
  10.  
  11. namespace NHibernate.Driver
  12. {
  13. public class EnhancedOracleResultSetsCommand : BasicResultSetsCommand
  14. {
  15. private const string driverAssemblyName = "Oracle.DataAccess";
  16.  
  17. private sqlString sqlString = new sqlString();
  18. private int cursorCount = 0;
  19. private readonly PropertyInfo oracleDbType;
  20. private readonly object oracleDbTypeRefCursor;
  21.  
  22. public EnhancedOracleResultSetsCommand(ISessionImplementor session)
  23. : base(session)
  24. {
  25. System.Type parameterType = ReflectHelper.TypeFromAssembly("Oracle.DataAccess.Client.OracleParameter",driverAssemblyName,false);
  26. oracleDbType = parameterType.GetProperty("OracleDbType");
  27.  
  28. System.Type oracleDbTypeEnum = ReflectHelper.TypeFromAssembly("Oracle.DataAccess.Client.OracleDbType",false);
  29. oracleDbTypeRefCursor = System.Enum.Parse(oracleDbTypeEnum,"RefCursor");
  30. }
  31.  
  32. public override void Append(IsqlCommand command)
  33. {
  34. Commands.Add(command);
  35. sqlString = sqlString.Append("\nOPEN :cursor")
  36. .Append(Convert.ToString(cursorCount++))
  37. .Append("\nFOR\n")
  38. .Append(command.Query).Append("\n;\n");
  39. }
  40.  
  41. public override sqlString sql
  42. {
  43. get { return sqlString; }
  44. }
  45.  
  46. public override IDataReader GetReader(int? commandTimeout)
  47. {
  48. var batcher = Session.Batcher;
  49. sqlType[] sqlTypes = Commands.SelectMany(c => c.ParameterTypes).ToArray();
  50. ForEachsqlCommand((sqlLoaderCommand,offset) => sqlLoaderCommand.ResetParametersIndexesForTheCommand(offset));
  51.  
  52. sqlString = sqlString.Insert(0,"\nBEGIN\n").Append("\nEND;\n");
  53.  
  54. var command = batcher.PrepareQueryCommand(CommandType.Text,sqlString,sqlTypes);
  55. if (commandTimeout.HasValue) {
  56. command.CommandTimeout = commandTimeout.Value;
  57. }
  58.  
  59. BindParameters(command);
  60.  
  61. for (int cursorIndex = 0; cursorIndex < cursorCount; cursorIndex++) {
  62. IDbDataParameter outCursor = command.CreateParameter();
  63. oracleDbType.SetValue(outCursor,oracleDbTypeRefCursor,null);
  64. outCursor.ParameterName = ":cursor" + Convert.ToString(cursorIndex);
  65. outCursor.Direction = ParameterDirection.Output;
  66. command.Parameters.Add(outCursor);
  67. }
  68.  
  69. return new BatcherDataReaderWrapper(batcher,command);
  70. }
  71. }
  72. }

猜你在找的Oracle相关文章