New test.
[mono.git] / mcs / class / System.Data / System.Data.SqlClient.jvm / SqlParameter.cs
1 //\r
2 // System.Data.SqlClient.SqlParameter\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 //
31
32 using System;
33 using System.Collections;
34 using System.Data;
35 using System.Data.ProviderBase;
36 using System.Data.Common;
37
38 using java.sql;
39
40 namespace System.Data.SqlClient
41 {
42         public sealed class SqlParameter : AbstractDbParameter
43         {
44                 #region Fields
45
46                 private SqlDbType _sqlDbType;
47
48                 #endregion // Fields
49
50                 #region Constructors
51
52                 public SqlParameter()
53                 {
54                 }
55
56                 public SqlParameter(String parameterName, Object value)
57                         : this(parameterName, SqlDbType.NVarChar, 0, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, value,false)
58                 {
59                 }
60
61                 public SqlParameter(String parameterName, SqlDbType dbType)
62                         : this(parameterName, dbType, 0, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null, true)
63                 {
64                 }
65
66         
67                 public SqlParameter(String parameterName, SqlDbType dbType, int size)
68                         : this(parameterName, dbType, size, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null, true)
69                 {
70                 }
71
72
73                 public SqlParameter(String parameterName, SqlDbType dbType, int size, String sourceColumn)
74                         : this(parameterName, dbType, size, ParameterDirection.Input, false, 0, 0, sourceColumn, DataRowVersion.Current, null, true)
75                 {
76                 }
77
78         
79                 public SqlParameter(
80                         String parameterName,
81                         SqlDbType dbType,
82                         int size,
83                         ParameterDirection direction,
84                         bool isNullable,
85                         byte precision,
86                         byte scale,
87                         String sourceColumn,
88                         DataRowVersion sourceVersion,
89                         Object value) : this(parameterName,dbType,size,direction,isNullable,precision,scale,sourceColumn,sourceVersion,value,true)
90                 {
91                 }
92
93                 public SqlParameter(
94                         String parameterName,
95                         SqlDbType dbType,
96                         int size,
97                         ParameterDirection direction,
98                         bool isNullable,
99                         byte precision,
100                         byte scale,
101                         String sourceColumn,
102                         DataRowVersion sourceVersion,
103                         Object value,
104                         bool dbTypeExplicit)
105                 {
106                         ParameterName = parameterName;
107                         SqlDbType = dbType;
108                         Size = size;
109                         Direction = direction;
110                         IsNullable = isNullable;
111                         Precision = precision;
112                         Scale = scale;
113                         SourceColumn = sourceColumn;
114                         SourceVersion = sourceVersion;
115                         if (!dbTypeExplicit) {
116                                 IsDbTypeSet = false;
117                         }
118                         Value = value;
119                 }
120
121                 #endregion // Constructors
122
123                 #region Properties
124
125                 public override DbType DbType\r
126         {\r
127             get { return SqlConvert.SqlDbTypeToDbType(_sqlDbType); }           \r
128                         set { SqlDbType = SqlConvert.DbTypeToSqlDbType(value); }\r
129         }                \r
130         \r
131         public SqlDbType SqlDbType\r
132         {\r
133             get { return _sqlDbType; }            \r
134                         set {\r
135                 _sqlDbType = value;\r
136                                 IsDbTypeSet = true;\r
137             }\r
138         }                 
139
140                 public override int Size
141                 {
142                         get {
143                                 int retVal = base.Size;
144                                 return retVal;
145                         }
146                         set {
147                                 if (value < 0) {
148                                         throw ExceptionHelper.InvalidSizeValue(value);
149                                 }
150
151                                 if (value != 0) {
152                                         base.Size = value;
153                                 }
154                                 else {
155                                         base.Size = -1;
156                                 }
157                         }
158                 }
159
160 #if NET_2_0\r
161                 public new byte Precision 
162                 { 
163                         get { return base.Precision; }\r
164                         set { base.Precision = value; } 
165                 }
166
167                 public new byte Scale 
168                 { 
169                         get { return base.Scale; }\r
170                         set { base.Scale = value; } 
171                 }\r
172 #endif
173
174                 protected internal override string Placeholder {\r
175                         get {\r
176                                 if (ParameterName.Length == 0 || ParameterName[0] == '@')
177                                         return ParameterName;
178
179                                 return String.Concat("@", ParameterName);       
180                         }\r
181                 }\r
182
183         
184                 public override Object Value
185                 {
186                         get { return base.Value; }
187                         set { 
188                                 if (!IsDbTypeSet && (value != null) && (value != DBNull.Value)) {\r
189                     _sqlDbType = SqlConvert.ValueTypeToSqlDbType(value.GetType());\r
190                                 }
191                                 base.Value = value; 
192                         }
193                 }
194
195                 #endregion // Properties
196
197                 #region Methods
198
199                 protected internal sealed override object ConvertValue(object value)\r
200                 {\r
201                         // can not convert null or DbNull to other types\r
202                         if (value == null || value == DBNull.Value) {\r
203                                 return value;\r
204                         }\r
205                         // .NET throws an exception to the user.\r
206                         object convertedValue = Convert.ChangeType(value,SqlConvert.SqlDbTypeToValueType(SqlDbType));\r
207                         return convertedValue;\r
208                 }
209
210                 protected internal sealed override void SetParameterName(ResultSet res)\r
211                 {\r
212                         string name = res.getString("COLUMN_NAME");\r
213                         if (name != null && name.Length > 0 && name[0] != '@')\r
214                                 name = String.Concat("@", name);\r
215                         ParameterName = name;\r
216                 }\r
217 \r
218                 protected internal sealed override void SetParameterDbType(ResultSet res)\r
219                 {\r
220                         int dataType = res.getInt("DATA_TYPE");\r
221                         SqlDbType = SqlConvert.JdbcTypeToSqlDbType(dataType);\r
222                         JdbcType = dataType;\r
223                 }\r
224 \r
225                 protected internal sealed override void SetSpecialFeatures(ResultSet res)\r
226                 {\r
227                         // do nothing\r
228                 }
229
230                 protected internal sealed override int JdbcTypeFromProviderType()\r
231                 {\r
232                         return SqlConvert.SqlDbTypeToJdbcType(SqlDbType);\r
233                 }
234
235                 #endregion // Methods  \r
236 \r
237         }
238 }