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
-
10
1
namespace NHibernate . Driver
11
2
{
12
3
/// <summary>
13
- /// A NHibernate Driver for using the Oracle.DataAccess DataProvider
4
+ /// A NHibernate Driver for using the Oracle.DataAccess (unmanaged) DataProvider
14
5
/// </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
21
7
{
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
-
31
8
/// <summary>
32
9
/// Initializes a new instance of <see cref="OracleDataClientDriver"/>.
33
10
/// </summary>
34
11
/// <exception cref="HibernateException">
35
12
/// Thrown when the <c>Oracle.DataAccess</c> assembly can not be loaded.
36
13
/// </exception>
37
14
public OracleDataClientDriver ( )
38
- : base (
39
- "Oracle.DataAccess.Client" ,
40
- driverAssemblyName ,
41
- connectionTypeName ,
42
- commandTypeName )
15
+ : base ( "Oracle.DataAccess" )
43
16
{
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 ) ; }
132
17
}
133
18
}
134
19
}
0 commit comments