2 // System.Data.OleDb.OleDbParameter
\r
5 // Konstantin Triger <kostat@mainsoft.com>
6 // Boris Kirzner <borisk@mainsoft.com>
8 // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
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:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
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.
36 using System.Data.Common;
\r
37 using System.Data.ProviderBase;
\r
42 namespace System.Data.OleDb
\r
44 public sealed class OleDbParameter : AbstractDbParameter
\r
49 private OleDbType _oleDbType = OleDbType.VarWChar;
\r
50 private bool _isOracleRefCursor = false;
\r
52 #endregion // Fields
\r
54 #region Constructors
\r
56 public OleDbParameter()
\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
64 IsDbTypeSet = false;
\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
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
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
87 public OleDbParameter(String parameterName,
\r
90 ParameterDirection direction,
\r
94 String sourceColumn,
\r
95 DataRowVersion sourceVersion,
\r
98 ParameterName = parameterName;
\r
101 Direction = direction;
\r
102 IsNullable = isNullable;
\r
103 Precision = precision;
\r
105 SourceColumn = sourceColumn;
\r
106 SourceVersion = sourceVersion;
\r
110 #endregion // Constructors
\r
114 public override DbType DbType
\r
116 get { return OleDbConvert.OleDbTypeToDbType(_oleDbType); }
\r
117 set { OleDbType = OleDbConvert.DbTypeToOleDbType(value); }
\r
120 public OleDbType OleDbType
\r
122 get { return _oleDbType; }
\r
124 _oleDbType = value;
\r
125 IsDbTypeSet = true;
\r
130 public new byte Precision
132 get { return base.Precision; }
\r
133 set { base.Precision = value; }
136 public new byte Scale
138 get { return base.Scale; }
\r
139 set { base.Scale = value; }
143 public new Object Value
\r
145 get { return base.Value; }
\r
147 if (!IsDbTypeSet && (value != null) && (value != DBNull.Value)) {
\r
148 _oleDbType = OleDbConvert.ValueTypeToOleDbType(value.GetType());
\r
150 base.Value = value;
\r
154 protected internal sealed override bool IsSpecial {
\r
156 return (Direction == ParameterDirection.Output) && IsOracleRefCursor;
\r
161 internal bool IsOracleRefCursor
\r
163 get { return _isOracleRefCursor; }
\r
164 set { _isOracleRefCursor = value; }
\r
167 #endregion // Properties
\r
171 protected internal sealed override object ConvertValue(object value)
\r
173 // can not convert null or DbNull to other types
\r
174 if (value == null || value == DBNull.Value) {
\r
178 // FIXME : some other way to do this?
\r
179 if (OleDbType == OleDbType.Binary) {
\r
182 // .NET throws an exception to the user.
\r
183 object convertedValue = value;
\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
192 return convertedValue;
\r
195 protected internal sealed override void SetParameterName(ResultSet res)
\r
197 ParameterName = res.getString("COLUMN_NAME");
\r
199 if (ParameterName.StartsWith("@")) {
\r
200 ParameterName = ParameterName.Remove(0,1);
\r
204 protected internal sealed override void SetParameterDbType(ResultSet res)
\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
213 else if (String.Compare("CLOB",typeName,true) == 0) {
\r
214 jdbcType = Types.CLOB;
\r
216 else if(String.Compare("FLOAT",typeName,true) == 0) {
\r
217 jdbcType = Types.FLOAT;
\r
219 else if(String.Compare("NVARCHAR2",typeName,true) == 0) {
\r
220 jdbcType = Types.VARCHAR;
\r
222 else if(String.Compare("NCHAR",typeName,true) == 0) {
\r
223 jdbcType = Types.VARCHAR;
\r
226 OleDbType = OleDbConvert.JdbcTypeToOleDbType(jdbcType);
\r
227 JdbcType = jdbcType;
\r
230 protected internal sealed override void SetSpecialFeatures(ResultSet res)
\r
232 IsOracleRefCursor = (res.getString("TYPE_NAME") == "REF CURSOR");
\r
235 protected internal sealed override int JdbcTypeFromProviderType()
\r
237 return OleDbConvert.OleDbTypeToJdbcType(OleDbType);
\r
240 #endregion // Methods
\r