2006-04-28 Marek Safar <marek.safar@seznam.cz>
[mono.git] / mcs / class / System.Data.OracleClient / System.Data.OracleClient.jvm / OracleParameter.cs
1 //\r
2 // System.Data.OracleClient.OracleParameter\r
3 //
4 // Authors:
5 //      Konstantin Triger <kostat@mainsoft.com>
6 //      Boris Kirzner <borisk@mainsoft.com>
7 //      
8 // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
9 //
10
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //\r
31 \r
32 \r
33 using System;\r
34 using System.Text;\r
35 using System.Data;\r
36 using System.Data.Common;\r
37 using System.Data.ProviderBase;\r
38 using System.Globalization;\r
39 \r
40 using java.sql;\r
41 using java.lang;\r
42 \r
43 namespace System.Data.OracleClient {\r
44         public sealed class OracleParameter : AbstractDbParameter, IDbDataParameter, ICloneable {\r
45 \r
46                 #region Fields\r
47 \r
48                 OracleType _oleDbType = OracleType.VarChar;\r
49 \r
50                 #endregion // Fields\r
51     \r
52                 #region Constructors\r
53 \r
54                 public OracleParameter() {\r
55                 }\r
56     \r
57                 public OracleParameter(String parameterName, Object value)\r
58                         : this (parameterName, OracleType.VarChar, 0, ParameterDirection.Input,\r
59                         false, 0, 0, String.Empty, DataRowVersion.Current, value) {\r
60                         _isDbTypeSet = false;\r
61                 }\r
62     \r
63                 public OracleParameter(String parameterName, OracleType dbType)\r
64                         : this (parameterName, dbType, 0, ParameterDirection.Input,\r
65                         false, 0, 0, String.Empty, DataRowVersion.Current, null) {\r
66                 }\r
67     \r
68                 public OracleParameter(String parameterName, OracleType dbType, int size)\r
69                         : this (parameterName, dbType, size, ParameterDirection.Input,\r
70                         false, 0, 0, String.Empty, DataRowVersion.Current, null) {\r
71                 }\r
72     \r
73                 public OracleParameter(String parameterName, OracleType dbType, int size,\r
74                         String sourceColumn)\r
75                         : this (parameterName, dbType, size, ParameterDirection.Input,\r
76                         false, 0, 0, sourceColumn, DataRowVersion.Current, null) {\r
77                 }\r
78     \r
79         \r
80                 public OracleParameter(String parameterName, \r
81                         OracleType dbType, \r
82                         int size,\r
83                         ParameterDirection direction, \r
84                         bool isNullable,\r
85                         byte precision, \r
86                         byte scale, \r
87                         String sourceColumn,\r
88                         DataRowVersion sourceVersion, \r
89                         Object value) {\r
90                         ParameterName = parameterName;\r
91                         OracleType = dbType;\r
92                         Size = size;\r
93                         Direction = direction;\r
94                         IsNullable = isNullable;\r
95                         Precision = precision;\r
96                         Scale = scale;\r
97                         SourceColumn = sourceColumn;\r
98                         SourceVersion = sourceVersion;\r
99                         Value = value;\r
100                 }\r
101 \r
102                 #endregion // Constructors\r
103 \r
104                 #region Properties\r
105 \r
106                 public override DbType DbType {\r
107                         get { return OracleConvert.OracleTypeToDbType(_oleDbType); }           \r
108                         set { OracleType = OracleConvert.DbTypeToOracleType(value); }\r
109                 }                \r
110         \r
111                 public OracleType OracleType {\r
112                         get { return _oleDbType; }            \r
113                         set {\r
114                                 _oleDbType = value;\r
115                                 _isDbTypeSet = true;\r
116                         }\r
117                 }    \r
118     \r
119                 public new Object Value {\r
120                         get { return base.Value; }\r
121                         set {\r
122                                 if (!_isDbTypeSet && (value != null) && (value != DBNull.Value)) {\r
123                                         _oleDbType = OracleConvert.ValueTypeToOracleType(value.GetType());\r
124                                 }\r
125                                 base.Value = value;\r
126                         }\r
127                 }\r
128 \r
129                 #endregion // Properties\r
130 \r
131                 #region Methods\r
132 \r
133                 public override String ToString() {\r
134                         return ParameterName;\r
135                 }\r
136 \r
137                 protected override string Placeholder {\r
138                         get {\r
139                                 if (ParameterName.Length == 0 || ParameterName[0] == ':')\r
140                                         return ParameterName;\r
141 \r
142                                 return String.Concat(":", ParameterName);\r
143                         }\r
144                 }\r
145 \r
146                 internal string InternalPlaceholder {\r
147                         get {\r
148                                 return Placeholder;\r
149                         }\r
150                 }\r
151     \r
152                 public override object Clone() {\r
153                         OracleParameter clone = new OracleParameter();\r
154                         CopyTo(clone);\r
155 \r
156                         clone._oleDbType = _oleDbType;\r
157                         clone._isDbTypeSet = _isDbTypeSet;\r
158                         return clone;\r
159                 }\r
160 \r
161                 protected sealed override object ConvertValue(object value) {\r
162                         // can not convert null or DbNull to other types\r
163                         if (value == null || value == DBNull.Value) {\r
164                                 return value;\r
165                         }\r
166 \r
167                         // TBD : some other way to do this?\r
168 //                      if (OracleType == OracleType.Binary) {\r
169 //                              return value;\r
170 //                      }\r
171                         // .NET throws an exception to the user.\r
172                         object convertedValue  = value;\r
173 \r
174                         // note : if we set user parameter jdbc type inside prepare interbal, the db type is not set\r
175                         if (value is IConvertible && (_isDbTypeSet || IsJdbcTypeSet)) {\r
176                                 OracleType oleDbType = (_isDbTypeSet) ? OracleType : OracleConvert.JdbcTypeToOracleType((int)JdbcType);\r
177                                 Type to = OracleConvert.OracleTypeToValueType(oleDbType);\r
178                                 if (!(value is DateTime && to == OracleConvert.TypeOfTimespan)) //anyway will go by jdbc type\r
179                                         convertedValue = Convert.ChangeType(value,to);\r
180                         }\r
181                         return convertedValue;\r
182                 }\r
183 \r
184                 protected sealed override void SetParameterName(ResultSet res) {\r
185                         ParameterName = res.getString("COLUMN_NAME");\r
186                 }\r
187 \r
188                 protected sealed override void SetParameterDbType(ResultSet res) {\r
189                         int jdbcType = res.getInt("DATA_TYPE");                 \r
190                         // FIXME : is that correct?\r
191                         if (jdbcType == Types.OTHER) {\r
192                                 string typeName = res.getString("TYPE_NAME");\r
193                                 if (String.Compare("REF CURSOR", typeName, true, CultureInfo.InvariantCulture) == 0) {\r
194                                         jdbcType = (int)JavaSqlTypes.CURSOR;\r
195                                 }\r
196                                 else if (String.Compare("BLOB",typeName,true, CultureInfo.InvariantCulture) == 0) {\r
197                                         jdbcType = (int)JavaSqlTypes.BLOB;\r
198                                 }\r
199                                 else if (String.Compare("CLOB",typeName,true, CultureInfo.InvariantCulture) == 0) {\r
200                                         jdbcType = (int)JavaSqlTypes.CLOB;\r
201                                 }\r
202                                 else if(String.Compare("FLOAT",typeName,true, CultureInfo.InvariantCulture) == 0) {\r
203                                         jdbcType = (int)JavaSqlTypes.FLOAT;\r
204                                 }\r
205                                 else if(String.Compare("NVARCHAR2",typeName,true, CultureInfo.InvariantCulture) == 0) {\r
206                                         jdbcType = (int)JavaSqlTypes.VARCHAR;\r
207                                 }\r
208                                 else if(String.Compare("NCHAR",typeName,true, CultureInfo.InvariantCulture) == 0) {\r
209                                         jdbcType = (int)JavaSqlTypes.VARCHAR;\r
210                                 }\r
211                         }\r
212                         OracleType = OracleConvert.JdbcTypeToOracleType(jdbcType);\r
213                         JdbcType = jdbcType;\r
214                 }\r
215 \r
216                 protected sealed override void SetSpecialFeatures(ResultSet res) {\r
217                         // do nothing\r
218                 }\r
219 \r
220                 protected sealed override int JdbcTypeFromProviderType() {\r
221                         return OracleConvert.OracleTypeToJdbcType(OracleType);\r
222                 }\r
223 \r
224                 #endregion // Methods\r
225     \r
226         }\r
227 }