New test.
[mono.git] / mcs / class / System.Data / System.Data.OleDb.jvm / OleDbParameter.cs
1 //\r
2 // System.Data.OleDb.OleDbParameter\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 \r
39 using java.sql;\r
40 using java.lang;\r
41 \r
42 namespace System.Data.OleDb\r
43 {\r
44     public sealed class OleDbParameter : AbstractDbParameter\r
45     {\r
46 \r
47                 #region Fields\r
48 \r
49         private OleDbType _oleDbType = OleDbType.VarWChar;\r
50                 private bool _isOracleRefCursor = false;\r
51 \r
52                 #endregion // Fields\r
53     \r
54                 #region Constructors\r
55 \r
56         public OleDbParameter()\r
57         {\r
58         }\r
59     \r
60         public OleDbParameter(String parameterName, Object value)\r
61                         : this (parameterName, OleDbType.VarWChar, 0, ParameterDirection.Input,\r
62                                         false, 0, 0, String.Empty, DataRowVersion.Current, value)\r
63         {\r
64                         IsDbTypeSet = false;\r
65         }\r
66     \r
67         public OleDbParameter(String parameterName, OleDbType dbType)\r
68                         : this (parameterName, dbType, 0, ParameterDirection.Input,\r
69                                         false, 0, 0, String.Empty, DataRowVersion.Current, null)\r
70         {\r
71         }\r
72     \r
73         public OleDbParameter(String parameterName, OleDbType dbType, int size)\r
74                         : this (parameterName, dbType, size, ParameterDirection.Input,\r
75                                         false, 0, 0, String.Empty, DataRowVersion.Current, null)\r
76         {\r
77         }\r
78     \r
79         public OleDbParameter(String parameterName, OleDbType dbType, int size,\r
80             String sourceColumn)\r
81                         : this (parameterName, dbType, size, ParameterDirection.Input,\r
82                                         false, 0, 0, sourceColumn, DataRowVersion.Current, null)\r
83         {\r
84         }\r
85     \r
86         \r
87         public OleDbParameter(String parameterName, \r
88                                                         OleDbType dbType, \r
89                                                         int size,\r
90                                                         ParameterDirection direction, \r
91                                                         bool isNullable,\r
92                                                         byte precision, \r
93                                                         byte scale, \r
94                                                         String sourceColumn,\r
95                                                         DataRowVersion sourceVersion, \r
96                                                         Object value)\r
97         {\r
98             ParameterName = parameterName;\r
99             OleDbType = dbType;\r
100             Size = size;\r
101             Direction = direction;\r
102             IsNullable = isNullable;\r
103             Precision = precision;\r
104             Scale = scale;\r
105             SourceColumn = sourceColumn;\r
106             SourceVersion = sourceVersion;\r
107             Value = value;\r
108         }\r
109 \r
110                 #endregion // Constructors\r
111 \r
112                 #region Properties\r
113 \r
114                 public override DbType DbType\r
115         {\r
116             get { return OleDbConvert.OleDbTypeToDbType(_oleDbType); }           \r
117                         set { OleDbType = OleDbConvert.DbTypeToOleDbType(value); }\r
118         }                \r
119         \r
120         public OleDbType OleDbType\r
121         {\r
122             get { return _oleDbType; }            \r
123                         set {\r
124                 _oleDbType = value;\r
125                                 IsDbTypeSet = true;\r
126             }\r
127         }    \r
128 \r
129 #if NET_2_0\r
130                 public new byte Precision 
131                 { 
132                         get { return base.Precision; }\r
133                         set { base.Precision = value; } 
134                 }
135
136                 public new byte Scale 
137                 { 
138                         get { return base.Scale; }\r
139                         set { base.Scale = value; } 
140                 }\r
141 #endif\r
142     \r
143         public new Object Value\r
144         {\r
145             get { return base.Value; }\r
146             set {\r
147                 if (!IsDbTypeSet && (value != null) && (value != DBNull.Value)) {\r
148                     _oleDbType = OleDbConvert.ValueTypeToOleDbType(value.GetType());\r
149                                 }\r
150                 base.Value = value;\r
151             }\r
152         }\r
153 \r
154                 protected internal sealed override bool IsSpecial {\r
155                         get {\r
156                                 return (Direction == ParameterDirection.Output) && IsOracleRefCursor;\r
157                         }\r
158                 }\r
159 \r
160 \r
161                 internal bool IsOracleRefCursor\r
162                 {\r
163                         get { return _isOracleRefCursor; }\r
164                         set { _isOracleRefCursor = value; }\r
165                 }\r
166 \r
167                 #endregion // Properties\r
168 \r
169                 #region Methods\r
170 \r
171                 protected internal sealed override object ConvertValue(object value)\r
172                 {\r
173                         // can not convert null or DbNull to other types\r
174                         if (value == null || value == DBNull.Value) {\r
175                                 return value;\r
176                         }\r
177 \r
178                         // FIXME : some other way to do this?\r
179                         if (OleDbType == OleDbType.Binary) {\r
180                                 return value;\r
181                         }\r
182                         // .NET throws an exception to the user.\r
183                         object convertedValue  = value;\r
184 \r
185                         // note : if we set user parameter jdbc type inside prepare interbal, the db type is not set\r
186                         if (value is IConvertible && (IsDbTypeSet || IsJdbcTypeSet)) {\r
187                                 OleDbType oleDbType = (IsDbTypeSet) ? OleDbType : OleDbConvert.JdbcTypeToOleDbType((int)JdbcType);\r
188                                 Type to = OleDbConvert.OleDbTypeToValueType(oleDbType);\r
189                                 if (!(value is DateTime && to == DbTypes.TypeOfTimespan)) //anyway will go by jdbc type\r
190                                         convertedValue = Convert.ChangeType(value,to);\r
191                         }\r
192                         return convertedValue;\r
193                 }\r
194 \r
195                 protected internal sealed override void SetParameterName(ResultSet res)\r
196                 {\r
197                         ParameterName = res.getString("COLUMN_NAME");\r
198 \r
199                         if (ParameterName.StartsWith("@")) {\r
200                                 ParameterName = ParameterName.Remove(0,1);\r
201                         }\r
202                 }\r
203 \r
204                 protected internal sealed override void SetParameterDbType(ResultSet res)\r
205                 {\r
206                         int jdbcType = res.getInt("DATA_TYPE");                 \r
207                         // FIXME : is that correct?\r
208                         if (jdbcType == Types.OTHER) {\r
209                                 string typeName = res.getString("TYPE_NAME");\r
210                                 if (String.Compare("BLOB",typeName,true) == 0) {\r
211                                         jdbcType = Types.BLOB;\r
212                                 }\r
213                                 else if (String.Compare("CLOB",typeName,true) == 0) {\r
214                                         jdbcType = Types.CLOB;\r
215                                 }\r
216                                 else if(String.Compare("FLOAT",typeName,true) == 0) {\r
217                                         jdbcType = Types.FLOAT;\r
218                                 }\r
219                                 else if(String.Compare("NVARCHAR2",typeName,true) == 0) {\r
220                                         jdbcType = Types.VARCHAR;\r
221                                 }\r
222                                 else if(String.Compare("NCHAR",typeName,true) == 0) {\r
223                                         jdbcType = Types.VARCHAR;\r
224                                 }\r
225                         }\r
226                         OleDbType = OleDbConvert.JdbcTypeToOleDbType(jdbcType);\r
227                         JdbcType = jdbcType;\r
228                 }\r
229 \r
230                 protected internal sealed override void SetSpecialFeatures(ResultSet res)\r
231                 {\r
232                         IsOracleRefCursor = (res.getString("TYPE_NAME") == "REF CURSOR");\r
233                 }\r
234 \r
235                 protected internal sealed override int JdbcTypeFromProviderType()\r
236                 {\r
237                         return OleDbConvert.OleDbTypeToJdbcType(OleDbType);\r
238                 }\r
239 \r
240                 #endregion // Methods\r
241     \r
242     }\r
243 }