I created DevartOracleDriver for NHibernate 3.2
code :
Devart.Data.Oracle.OracleUtils.OracleClientCompatible = true;
is implemented by reflection for not referencing Devart.Data.Oracle.dll in Core Project
using System;
using System.Reflection;
using NHibernate.AdoNet;
namespace NHibernate.Driver
{
///
/// NHibernate에서 사용할 Oracle용 Driver입니다. Devart dotConnector for Oracle 라이브러리를 사용합니다.
/// 참고 : http://www.devart.com/blogs/dotconnect/?p=1857 (Old Version)
/// 참고 : http://www.devart.com/forums/viewtopic.php?t=15685 (New Version)
///
///
/// NHibernate configuration 속성 중에 connection.driver_class 값을
/// "NHibernate.Driver.DevartOracleDriver, RCL.Data.DevartOracle" 로 해주면 Oracle Driver를 Devart.Data.Oracle.dll을 사용합니다.
/// NOTE: NHIbernate configuration 에 qualifyAssembly 를 정의하여, Devart.Data.Oracle.dll의 QualifiedAssemblyName을 등록해주어야 합니다.
/// NOTE: http://www.devart.com/blogs/dotconnect/?p=1857 의 4번, 5번 항을 주의하세요.
///
///
///
/// // hibernate.cfg.xml 에서 다음과 같이 설정하시면 됩니다.
/// NHibernate.Driver.DevartOracleDriver, RCL.Data.DevartOracle
///
///
public sealed class DevartOracleDriver : ReflectionBasedDriver, IEmbeddedBatcherFactoryProvider
{
#region >
private static readonly NLog.Logger log = NLog.LogManager.GetCurrentClassLogger();
#endregion
private const string CommandTypeName = "Devart.Data.Oracle.NHibernate.NHibernateOracleCommand";
private const string ConnectionTypeName = "Devart.Data.Oracle.NHibernate.NHibernateOracleConnection";
private const string DriverAssemblyName = "Devart.Data.Oracle";
///
/// Constructor
///
public DevartOracleDriver()
: base(DriverAssemblyName, ConnectionTypeName, CommandTypeName)
{
if(log.IsInfoEnabled)
log.Info("NHibernate용 DevartOracleDriver를 생성했습니다.");
Intialize();
}
public override bool UseNamedPrefixInSql
{
get { return true; }
}
public override bool UseNamedPrefixInParameter
{
get { return true; }
}
public override string NamedPrefix
{
get { return ":"; }
}
System.Type IEmbeddedBatcherFactoryProvider.BatcherFactoryClass
{
get { return typeof(OracleDataClientBatchingBatcherFactory); }
}
///
///
///
private void Intialize()
{
// NOTE: NHibernate 3.2 이상에서 Devart Oracle의 Parameter 작업이 이상 작동하는 것을 교정하기 위해 OracleClientCompatible 필드 값을 True로 설정합니다.
// 참고: http://www.devart.com/forums/viewtopic.php?t=21676
const string DevartDataOracleAssemblyName = "Devart.Data.Oracle";
const string OracleUtilsTypeName = "Devart.Data.Oracle.OracleUtils";
const string OracleClientCompatibleFieldName = "OracleClientCompatible";
if(log.IsInfoEnabled)
{
log.Info("Devart.Data.Oracle.OracleUtils.OracleClientCompatible 값을 true로 설정합니다...");
log.Info("NHibernate 3.2 이상에서 Devart Oracle의 Parameter 작업이 이상 작동하는 것을 교정하기 위해 OracleClientCompatible 필드 값을 True로 설정합니다.");
}
try
{
var asm = Assembly.Load(DevartDataOracleAssemblyName);
var type = asm.GetType(OracleUtilsTypeName);
var fi = type.GetField(OracleClientCompatibleFieldName, BindingFlags.Public | BindingFlags.Static);
fi.SetValue(null, true);
}
catch(Exception ex)
{
if(log.IsErrorEnabled)
log.ErrorException("Devart.Data.Oracle.OracleUtils.OracleClientCompatible 값을 true로 설정하는데 예외가 발생했습니다.", ex);
throw;
}
}
}
}
Search found 4 matches
- Sat 17 Sep 2011 10:25
- Forum: dotConnect for Oracle
- Topic: DevartOracleDriver for NHibernate 3.2
- Replies: 1
- Views: 1944
- Thu 15 Sep 2011 18:09
- Forum: dotConnect for Oracle
- Topic: NHibernate 3.2 GA and Parameter Name error
- Replies: 13
- Views: 6907
NHibernate 3.2 GA and Parameter Name error
Using dotConnector for Oracle 6.50.214.0 and NHibernate 3.2 GA.
Not solve parameter naming error.
Test by QueryOver
[ SELECT this_.COMPANY_ID as COMPANY1_4_0_, this_.COMPANY_CODE as COMPANY2_4_0_, this_.COMPANY_NAME as COMPANY3_4_0_, this_.UpdateTimestamp as UpdateTi4_4_0_ FROM NH_COMPANY this_ WHERE this_.COMPANY_CODE = :p0 ]
Name:cp0 - Value:NHibernate
[SQL: SELECT this_.COMPANY_ID as COMPANY1_4_0_, this_.COMPANY_CODE as COMPANY2_4_0_, this_.COMPANY_NAME as COMPANY3_4_0_, this_.UpdateTimestamp as UpdateTi4_4_0_ FROM NH_COMPANY this_ WHERE this_.COMPANY_CODE = :p0]
----> Devart.Data.Oracle.OracleException : ORA-01008: not all variables bound
Other test (LINQ)
NHibernate.Exceptions.GenericADOException : could not execute query
[ select company0_.COMPANY_ID as COMPANY1_4_, company0_.COMPANY_CODE as COMPANY2_4_, company0_.COMPANY_NAME as COMPANY3_4_, company0_.UpdateTimestamp as UpdateTi4_4_ from NH_COMPANY company0_ where company0_.COMPANY_CODE=:p0 ]
Name:p1 - Value:REALWEB
[SQL: select company0_.COMPANY_ID as COMPANY1_4_, company0_.COMPANY_CODE as COMPANY2_4_, company0_.COMPANY_NAME as COMPANY3_4_, company0_.UpdateTimestamp as UpdateTi4_4_ from NH_COMPANY company0_ where company0_.COMPANY_CODE=:p0]
----> Devart.Data.Oracle.OracleException : ORA-01008: not all variables bound
set Direct = true.
Did I mistake ?
if NHibernate 3.1 GA, no problem.
Not solve parameter naming error.
Test by QueryOver
[ SELECT this_.COMPANY_ID as COMPANY1_4_0_, this_.COMPANY_CODE as COMPANY2_4_0_, this_.COMPANY_NAME as COMPANY3_4_0_, this_.UpdateTimestamp as UpdateTi4_4_0_ FROM NH_COMPANY this_ WHERE this_.COMPANY_CODE = :p0 ]
Name:cp0 - Value:NHibernate
[SQL: SELECT this_.COMPANY_ID as COMPANY1_4_0_, this_.COMPANY_CODE as COMPANY2_4_0_, this_.COMPANY_NAME as COMPANY3_4_0_, this_.UpdateTimestamp as UpdateTi4_4_0_ FROM NH_COMPANY this_ WHERE this_.COMPANY_CODE = :p0]
----> Devart.Data.Oracle.OracleException : ORA-01008: not all variables bound
Other test (LINQ)
NHibernate.Exceptions.GenericADOException : could not execute query
[ select company0_.COMPANY_ID as COMPANY1_4_, company0_.COMPANY_CODE as COMPANY2_4_, company0_.COMPANY_NAME as COMPANY3_4_, company0_.UpdateTimestamp as UpdateTi4_4_ from NH_COMPANY company0_ where company0_.COMPANY_CODE=:p0 ]
Name:p1 - Value:REALWEB
[SQL: select company0_.COMPANY_ID as COMPANY1_4_, company0_.COMPANY_CODE as COMPANY2_4_, company0_.COMPANY_NAME as COMPANY3_4_, company0_.UpdateTimestamp as UpdateTi4_4_ from NH_COMPANY company0_ where company0_.COMPANY_CODE=:p0]
----> Devart.Data.Oracle.OracleException : ORA-01008: not all variables bound
set Direct = true.
Did I mistake ?
if NHibernate 3.1 GA, no problem.
- Sat 20 Aug 2011 15:42
- Forum: dotConnect Universal
- Topic: Need for NHibernate Driver
- Replies: 1
- Views: 1977
Need for NHibernate Driver
I used dotConnector for Oracle, and now use dotConnect Universal
I made Devart Oracle Driver for NHibernate like this
public DevartOracleDriver() : base("Devart.Data.Oracle", "Devart.Data.Oracle.NHibernate.NHibernateOracleConnection", "Devart.Data.Oracle.NHibernate.NHibernateOracleCommand")
but dotConnect Universal was obucasted NHibernateOracleConnection, NHibernateOracleCommand !!!
I modify Driver like this
public DevartOracleDriver() : base("Devart.Data.Universal.Oracle",
"Devart.Data.Oracle.NHibernate.a",
"Devart.Data.Oracle.NHibernate.b")
.....
Please don't obscast Class name
I made Devart Oracle Driver for NHibernate like this
public DevartOracleDriver() : base("Devart.Data.Oracle", "Devart.Data.Oracle.NHibernate.NHibernateOracleConnection", "Devart.Data.Oracle.NHibernate.NHibernateOracleCommand")
but dotConnect Universal was obucasted NHibernateOracleConnection, NHibernateOracleCommand !!!
I modify Driver like this
public DevartOracleDriver() : base("Devart.Data.Universal.Oracle",
"Devart.Data.Oracle.NHibernate.a",
"Devart.Data.Oracle.NHibernate.b")
.....
Please don't obscast Class name
- Wed 10 Aug 2011 01:16
- Forum: dotConnect for Oracle
- Topic: NHibernate 3.2 GA and Direct Mode raise Error
- Replies: 1
- Views: 1329
NHibernate 3.2 GA and Direct Mode raise Error
I used dotConnect for Oracle and NHibernate 3.1 GA. it all right !!!
but upgrade to NHibernate 3.2 GA, raise ORA-01008: not all variables bound
need :p0 but :p1
I won't use indirect mode... should use direct mode...
==========================================================
2011-08-10 01:12:40.1844 [6] [Error] [RCL.Data.NH.NLogLogger.Error]#
ORA-01008: not all variables bound
2011-08-10 01:12:40.1844 [6] [Debug] [RCL.Data.NH.NLogLogger.Debug]#
after autocommit
2011-08-10 01:12:40.1844 [6] [Debug] [RCL.Data.NH.NLogLogger.Debug]#
transaction completion
2011-08-10 01:12:40.1844 [6] [Debug] [RCL.Data.NH.NLogLogger.Debug]#
aggressively releasing database connection
Test 'RCL.Data.DevartOracle.NH.Domains.MappingTestCase.SimpleEntity'
failed: NHibernate.Exceptions.GenericADOException : could not execute
query
[ select company0_.COMPANY_ID as COMPANY1_2_, company0_.COMPANY_CODE
as COMPANY2_2_, company0_.COMPANY_NAME as COMPANY3_2_,
company0_.UpdateTimestamp as UpdateTi4_2_ from NH_COMPANY company0_
where company0_.COMPANY_CODE=:p0 ]
Name:p1 - Value:REALWEB
[SQL: select company0_.COMPANY_ID as COMPANY1_2_,
company0_.COMPANY_CODE as COMPANY2_2_, company0_.COMPANY_NAME as
COMPANY3_2_, company0_.UpdateTimestamp as UpdateTi4_2_ from NH_COMPANY
company0_ where company0_.COMPANY_CODE=:p0]
----> Devart.Data.Oracle.OracleException : ORA-01008: not all
variables bound
위치: NHibernate.Loader.Loader.DoList(ISessionImplementor session,
QueryParameters queryParameters)
위치: NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor
session, QueryParameters queryParameters)
위치:
NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor
session, QueryParameters queryParameters)
위치:
NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor
session, QueryParameters queryParameters)
위치: NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters
queryParameters, ISessionImplementor session, IList results)
위치: NHibernate.Impl.SessionImpl.List(IQueryExpression
queryExpression, QueryParameters queryParameters, IList results)
위치: NHibernate.Impl.AbstractSessionImpl.List(IQueryExpression
queryExpression, QueryParameters parameters)
위치: NHibernate.Impl.ExpressionQueryImpl.List()
위치:
NHibernate.Linq.DefaultQueryProvider.ExecuteQuery(NhLinqExpression
nhLinqExpression, IQuery query, NhLinqExpression nhQuery)
위치: NHibernate.Linq.DefaultQueryProvider.Execute(Expression
expression)
위치: NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression
expression)
위치: System.Linq.Queryable.Single[TSource](IQueryable`1 source)
D:\RealWeb Products\RCL\RCL-svn\RCL-Data\RCL.Data.DevartOracle.Test\NH
\Domains\MappingTestCase.cs(23,0): 위치:
RCL.Data.DevartOracle.NH.Domains.MappingTestCase.SimpleEntity()
--OracleException
위치: Devart.Data.Oracle.ao.d()
위치: Devart.Data.Oracle.x.m()
위치: Devart.Data.Oracle.x.c()
위치: Devart.Data.Oracle.u.a(Int32 A_0, bf A_1)
위치: Devart.Data.Oracle.OracleCommand.InternalExecute(CommandBehavior
behavior, IDisposable disposable, Int32 startRecord, Int32 maxRecords,
Boolean nonQuery)
위치: Devart.Common.DbCommandBase.ExecuteDbDataReader(CommandBehavior
behavior, Boolean nonQuery)
위치:
System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
위치: NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
위치: NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean
autoDiscoverTypes, Boolean callable, RowSelection selection,
ISessionImplementor session)
위치: NHibernate.Loader.Loader.DoQuery(ISessionImplementor session,
QueryParameters queryParameters, Boolean returnProxies)
위치:
NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor
session, QueryParameters queryParameters, Boolean returnProxies)
위치: NHibernate.Loader.Loader.DoList(ISessionImplementor session,
QueryParameters queryParameters)
but upgrade to NHibernate 3.2 GA, raise ORA-01008: not all variables bound
need :p0 but :p1
I won't use indirect mode... should use direct mode...
==========================================================
2011-08-10 01:12:40.1844 [6] [Error] [RCL.Data.NH.NLogLogger.Error]#
ORA-01008: not all variables bound
2011-08-10 01:12:40.1844 [6] [Debug] [RCL.Data.NH.NLogLogger.Debug]#
after autocommit
2011-08-10 01:12:40.1844 [6] [Debug] [RCL.Data.NH.NLogLogger.Debug]#
transaction completion
2011-08-10 01:12:40.1844 [6] [Debug] [RCL.Data.NH.NLogLogger.Debug]#
aggressively releasing database connection
Test 'RCL.Data.DevartOracle.NH.Domains.MappingTestCase.SimpleEntity'
failed: NHibernate.Exceptions.GenericADOException : could not execute
query
[ select company0_.COMPANY_ID as COMPANY1_2_, company0_.COMPANY_CODE
as COMPANY2_2_, company0_.COMPANY_NAME as COMPANY3_2_,
company0_.UpdateTimestamp as UpdateTi4_2_ from NH_COMPANY company0_
where company0_.COMPANY_CODE=:p0 ]
Name:p1 - Value:REALWEB
[SQL: select company0_.COMPANY_ID as COMPANY1_2_,
company0_.COMPANY_CODE as COMPANY2_2_, company0_.COMPANY_NAME as
COMPANY3_2_, company0_.UpdateTimestamp as UpdateTi4_2_ from NH_COMPANY
company0_ where company0_.COMPANY_CODE=:p0]
----> Devart.Data.Oracle.OracleException : ORA-01008: not all
variables bound
위치: NHibernate.Loader.Loader.DoList(ISessionImplementor session,
QueryParameters queryParameters)
위치: NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor
session, QueryParameters queryParameters)
위치:
NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor
session, QueryParameters queryParameters)
위치:
NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor
session, QueryParameters queryParameters)
위치: NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters
queryParameters, ISessionImplementor session, IList results)
위치: NHibernate.Impl.SessionImpl.List(IQueryExpression
queryExpression, QueryParameters queryParameters, IList results)
위치: NHibernate.Impl.AbstractSessionImpl.List(IQueryExpression
queryExpression, QueryParameters parameters)
위치: NHibernate.Impl.ExpressionQueryImpl.List()
위치:
NHibernate.Linq.DefaultQueryProvider.ExecuteQuery(NhLinqExpression
nhLinqExpression, IQuery query, NhLinqExpression nhQuery)
위치: NHibernate.Linq.DefaultQueryProvider.Execute(Expression
expression)
위치: NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression
expression)
위치: System.Linq.Queryable.Single[TSource](IQueryable`1 source)
D:\RealWeb Products\RCL\RCL-svn\RCL-Data\RCL.Data.DevartOracle.Test\NH
\Domains\MappingTestCase.cs(23,0): 위치:
RCL.Data.DevartOracle.NH.Domains.MappingTestCase.SimpleEntity()
--OracleException
위치: Devart.Data.Oracle.ao.d()
위치: Devart.Data.Oracle.x.m()
위치: Devart.Data.Oracle.x.c()
위치: Devart.Data.Oracle.u.a(Int32 A_0, bf A_1)
위치: Devart.Data.Oracle.OracleCommand.InternalExecute(CommandBehavior
behavior, IDisposable disposable, Int32 startRecord, Int32 maxRecords,
Boolean nonQuery)
위치: Devart.Common.DbCommandBase.ExecuteDbDataReader(CommandBehavior
behavior, Boolean nonQuery)
위치:
System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
위치: NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
위치: NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean
autoDiscoverTypes, Boolean callable, RowSelection selection,
ISessionImplementor session)
위치: NHibernate.Loader.Loader.DoQuery(ISessionImplementor session,
QueryParameters queryParameters, Boolean returnProxies)
위치:
NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor
session, QueryParameters queryParameters, Boolean returnProxies)
위치: NHibernate.Loader.Loader.DoList(ISessionImplementor session,
QueryParameters queryParameters)