Merge branch 'master' of git://github.com/mono/mono
[mono.git] / mcs / class / System.Data.OracleClient / System.Data.OracleClient.jvm / OracleParameter.cs
1 //\r
2 // System.Data.OracleClient.OracleParameter\r
3 //\r
4 // Authors:\r
5 //      Konstantin Triger <kostat@mainsoft.com>\r
6 //      Boris Kirzner <borisk@mainsoft.com>\r
7 //      \r
8 // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)\r
9 //\r
10 \r
11 //\r
12 // Permission is hereby granted, free of charge, to any person obtaining\r
13 // a copy of this software and associated documentation files (the\r
14 // "Software"), to deal in the Software without restriction, including\r
15 // without limitation the rights to use, copy, modify, merge, publish,\r
16 // distribute, sublicense, and/or sell copies of the Software, and to\r
17 // permit persons to whom the Software is furnished to do so, subject to\r
18 // the following conditions:\r
19 // \r
20 // The above copyright notice and this permission notice shall be\r
21 // included in all copies or substantial portions of the Software.\r
22 // \r
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
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, 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 #if NET_2_0\r
130                 public new byte Precision {\r
131                         get { return base.Precision; }\r
132                         set { base.Precision = value; }\r
133                 }\r
134 \r
135                 public new byte Scale {\r
136                         get { return base.Scale; }\r
137                         set { base.Scale = value; }\r
138                 }\r
139 #endif\r
140 \r
141                 #endregion // Properties\r
142 \r
143                 #region Methods\r
144 \r
145                 public override String ToString() {\r
146                         return ParameterName;\r
147                 }\r
148 \r
149                 protected override string Placeholder {\r
150                         get {\r
151                                 if (ParameterName.Length == 0 || ParameterName[0] == ':')\r
152                                         return ParameterName;\r
153 \r
154                                 return String.Concat(":", ParameterName);\r
155                         }\r
156                 }\r
157 \r
158                 internal string InternalPlaceholder {\r
159                         get {\r
160                                 return Placeholder;\r
161                         }\r
162                 }\r
163 \r
164                 protected sealed override object ConvertValue(object value) {\r
165                         // can not convert null or DbNull to other types\r
166                         if (value == null || value == DBNull.Value) {\r
167                                 return value;\r
168                         }\r
169 \r
170                         // TBD : some other way to do this?\r
171 //                      if (OracleType == OracleType.Binary) {\r
172 //                              return value;\r
173 //                      }\r
174                         // .NET throws an exception to the user.\r
175                         object convertedValue  = value;\r
176 \r
177                         // note : if we set user parameter jdbc type inside prepare interbal, the db type is not set\r
178                         if (value is IConvertible && (IsDbTypeSet || IsJdbcTypeSet)) {\r
179                                 OracleType oleDbType = (IsDbTypeSet) ? OracleType : OracleConvert.JdbcTypeToOracleType((int)JdbcType);\r
180                                 Type to = OracleConvert.OracleTypeToValueType(oleDbType);\r
181                                 if (!(value is DateTime && to == OracleConvert.TypeOfTimespan)) //anyway will go by jdbc type\r
182                                         convertedValue = Convert.ChangeType(value,to);\r
183                         }\r
184                         return convertedValue;\r
185                 }\r
186 \r
187                 protected sealed override void SetParameterName(ResultSet res) {\r
188                         ParameterName = res.getString("COLUMN_NAME");\r
189                 }\r
190 \r
191                 protected sealed override void SetParameterDbType(ResultSet res) {\r
192                         int jdbcType = res.getInt("DATA_TYPE");                 \r
193                         // FIXME : is that correct?\r
194                         if (jdbcType == Types.OTHER) {\r
195                                 string typeName = res.getString("TYPE_NAME");\r
196                                 if (String.Compare("REF CURSOR", typeName, true, CultureInfo.InvariantCulture) == 0) {\r
197                                         jdbcType = (int)JavaSqlTypes.CURSOR;\r
198                                 }\r
199                                 else if (String.Compare("BLOB",typeName,true, CultureInfo.InvariantCulture) == 0) {\r
200                                         jdbcType = (int)JavaSqlTypes.BLOB;\r
201                                 }\r
202                                 else if (String.Compare("CLOB",typeName,true, CultureInfo.InvariantCulture) == 0) {\r
203                                         jdbcType = (int)JavaSqlTypes.CLOB;\r
204                                 }\r
205                                 else if(String.Compare("FLOAT",typeName,true, CultureInfo.InvariantCulture) == 0) {\r
206                                         jdbcType = (int)JavaSqlTypes.FLOAT;\r
207                                 }\r
208                                 else if(String.Compare("NVARCHAR2",typeName,true, CultureInfo.InvariantCulture) == 0) {\r
209                                         jdbcType = (int)JavaSqlTypes.VARCHAR;\r
210                                 }\r
211                                 else if(String.Compare("NCHAR",typeName,true, CultureInfo.InvariantCulture) == 0) {\r
212                                         jdbcType = (int)JavaSqlTypes.VARCHAR;\r
213                                 }\r
214                         }\r
215                         OracleType = OracleConvert.JdbcTypeToOracleType(jdbcType);\r
216                         JdbcType = jdbcType;\r
217                 }\r
218 \r
219                 protected sealed override void SetSpecialFeatures(ResultSet res) {\r
220                         // do nothing\r
221                 }\r
222 \r
223                 protected sealed override int JdbcTypeFromProviderType() {\r
224                         return OracleConvert.OracleTypeToJdbcType(OracleType);\r
225                 }\r
226 \r
227                 #endregion // Methods\r
228     \r
229         }\r
230 }