1- using System ;
2- using System . Data ;
3- using System . Data . Common ;
4- using System . Reflection ;
5- using NHibernate . AdoNet ;
6- using NHibernate . Engine . Query ;
7- using NHibernate . SqlTypes ;
8- using NHibernate . Util ;
9-
101namespace NHibernate . Driver
112{
123 /// <summary>
13- /// A NHibernate Driver for using the Oracle.DataAccess DataProvider
4+ /// A NHibernate Driver for using the Oracle.DataAccess (unmanaged) DataProvider
145 /// </summary>
15- /// <remarks>
16- /// Code was contributed by <a href="http://sourceforge.net/users/jemcalgary/">James Mills</a>
17- /// on the NHibernate forums in this
18- /// <a href="http://sourceforge.net/forum/message.php?msg_id=2952662">post</a>.
19- /// </remarks>
20- public class OracleDataClientDriver : ReflectionBasedDriver , IEmbeddedBatcherFactoryProvider
6+ public class OracleDataClientDriver : OracleDataClientDriverBase
217 {
22- private const string driverAssemblyName = "Oracle.DataAccess" ;
23- private const string connectionTypeName = "Oracle.DataAccess.Client.OracleConnection" ;
24- private const string commandTypeName = "Oracle.DataAccess.Client.OracleCommand" ;
25- private static readonly SqlType GuidSqlType = new SqlType ( DbType . Binary , 16 ) ;
26- private readonly PropertyInfo oracleCommandBindByName ;
27- private readonly PropertyInfo oracleDbType ;
28- private readonly object oracleDbTypeRefCursor ;
29- private readonly object oracleDbTypeXmlType ;
30-
318 /// <summary>
329 /// Initializes a new instance of <see cref="OracleDataClientDriver"/>.
3310 /// </summary>
3411 /// <exception cref="HibernateException">
3512 /// Thrown when the <c>Oracle.DataAccess</c> assembly can not be loaded.
3613 /// </exception>
3714 public OracleDataClientDriver ( )
38- : base (
39- "Oracle.DataAccess.Client" ,
40- driverAssemblyName ,
41- connectionTypeName ,
42- commandTypeName )
15+ : base ( "Oracle.DataAccess" )
4316 {
44- System . Type oracleCommandType = ReflectHelper . TypeFromAssembly ( "Oracle.DataAccess.Client.OracleCommand" , driverAssemblyName , false ) ;
45- oracleCommandBindByName = oracleCommandType . GetProperty ( "BindByName" ) ;
46-
47- System . Type parameterType = ReflectHelper . TypeFromAssembly ( "Oracle.DataAccess.Client.OracleParameter" , driverAssemblyName , false ) ;
48- oracleDbType = parameterType . GetProperty ( "OracleDbType" ) ;
49-
50- System . Type oracleDbTypeEnum = ReflectHelper . TypeFromAssembly ( "Oracle.DataAccess.Client.OracleDbType" , driverAssemblyName , false ) ;
51- oracleDbTypeRefCursor = Enum . Parse ( oracleDbTypeEnum , "RefCursor" ) ;
52- oracleDbTypeXmlType = Enum . Parse ( oracleDbTypeEnum , "XmlType" ) ;
53- }
54-
55- /// <summary></summary>
56- public override bool UseNamedPrefixInSql
57- {
58- get { return true ; }
59- }
60-
61- /// <summary></summary>
62- public override bool UseNamedPrefixInParameter
63- {
64- get { return true ; }
65- }
66-
67- /// <summary></summary>
68- public override string NamedPrefix
69- {
70- get { return ":" ; }
71- }
72-
73- /// <remarks>
74- /// This adds logic to ensure that a DbType.Boolean parameter is not created since
75- /// ODP.NET doesn't support it.
76- /// </remarks>
77- protected override void InitializeParameter ( DbParameter dbParam , string name , SqlType sqlType )
78- {
79- // if the parameter coming in contains a boolean then we need to convert it
80- // to another type since ODP.NET doesn't support DbType.Boolean
81- switch ( sqlType . DbType )
82- {
83- case DbType . Boolean :
84- base . InitializeParameter ( dbParam , name , SqlTypeFactory . Int16 ) ;
85- break ;
86- case DbType . Guid :
87- base . InitializeParameter ( dbParam , name , GuidSqlType ) ;
88- break ;
89- case DbType . Xml :
90- this . InitializeParameter ( dbParam , name , oracleDbTypeXmlType ) ;
91- break ;
92- default :
93- base . InitializeParameter ( dbParam , name , sqlType ) ;
94- break ;
95- }
96- }
97-
98- private void InitializeParameter ( DbParameter dbParam , string name , object sqlType )
99- {
100- dbParam . ParameterName = FormatNameForParameter ( name ) ;
101- oracleDbType . SetValue ( dbParam , sqlType , null ) ;
102- }
103-
104- protected override void OnBeforePrepare ( DbCommand command )
105- {
106- base . OnBeforePrepare ( command ) ;
107-
108- // need to explicitly turn on named parameter binding
109- // http://tgaw.wordpress.com/2006/03/03/ora-01722-with-odp-and-command-parameters/
110- oracleCommandBindByName . SetValue ( command , true , null ) ;
111-
112- CallableParser . Detail detail = CallableParser . Parse ( command . CommandText ) ;
113-
114- if ( ! detail . IsCallable )
115- return ;
116-
117- command . CommandType = CommandType . StoredProcedure ;
118- command . CommandText = detail . FunctionName ;
119- oracleCommandBindByName . SetValue ( command , false , null ) ;
120-
121- var outCursor = command . CreateParameter ( ) ;
122- oracleDbType . SetValue ( outCursor , oracleDbTypeRefCursor , null ) ;
123-
124- outCursor . Direction = detail . HasReturn ? ParameterDirection . ReturnValue : ParameterDirection . Output ;
125-
126- command . Parameters . Insert ( 0 , outCursor ) ;
127- }
128-
129- System . Type IEmbeddedBatcherFactoryProvider . BatcherFactoryClass
130- {
131- get { return typeof ( OracleDataClientBatchingBatcherFactory ) ; }
13217 }
13318 }
13419}
0 commit comments