4 // Part of the Mono class libraries at
5 // mcs/class/System.Data.OracleClient/System.Data.OracleClient
7 // Assembly: System.Data.OracleClient.dll
8 // Namespace: System.Data.OracleClient
11 // Tim Coleman <tim@timcoleman.com>
13 // Copyright (C) Tim Coleman , 2003
15 // Licensed under the MIT/X11 License.
19 using System.Collections;
20 using System.ComponentModel;
22 using System.Data.OracleClient.Oci;
23 using System.Globalization;
24 using System.Runtime.InteropServices;
26 namespace System.Data.OracleClient {
27 [TypeConverter (typeof(OracleParameter.OracleParameterConverter))]
28 public sealed class OracleParameter : MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable
33 OracleType oracleType = OracleType.VarChar;
36 ParameterDirection direction = ParameterDirection.Input;
41 DataRowVersion srcVersion;
42 DbType dbType = DbType.AnsiString;
47 OracleParameterCollection container = null;
48 OciBindHandle bindHandle;
54 public OracleParameter ()
55 : this (String.Empty, OracleType.VarChar, 0, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null)
59 public OracleParameter (string name, object value)
63 SourceVersion = DataRowVersion.Current;
64 InferOracleType (value);
67 public OracleParameter (string name, OracleType dataType)
68 : this (name, dataType, 0, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null)
72 public OracleParameter (string name, OracleType dataType, int size)
73 : this (name, dataType, size, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null)
77 public OracleParameter (string name, OracleType dataType, int size, string srcColumn)
78 : this (name, dataType, size, ParameterDirection.Input, false, 0, 0, srcColumn, DataRowVersion.Current, null)
82 public OracleParameter (string name, OracleType dataType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value)
88 OracleType = dataType;
89 Direction = direction;
90 SourceColumn = srcColumn;
91 SourceVersion = srcVersion;
94 #endregion // Constructors
98 internal OracleParameterCollection Container {
99 get { return container; }
100 set { container = value; }
104 [RefreshProperties (RefreshProperties.All)]
105 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
106 public DbType DbType {
107 get { return dbType; }
108 set { SetDbType (value); }
111 [DefaultValue (ParameterDirection.Input)]
112 [RefreshProperties (RefreshProperties.All)]
113 public ParameterDirection Direction {
114 get { return direction; }
115 set { direction = value; }
120 [DefaultValue (false)]
121 [EditorBrowsable (EditorBrowsableState.Never)]
122 public bool IsNullable {
123 get { return isNullable; }
124 set { isNullable = value; }
130 get { return offset; }
131 set { offset = value; }
134 [DefaultValue (OracleType.VarChar)]
135 [RefreshProperties (RefreshProperties.All)]
136 public OracleType OracleType {
137 get { return oracleType; }
138 set { SetOracleType (value); }
142 public string ParameterName {
144 set { name = value; }
148 public byte Precision {
149 get { return precision; }
150 set { /* NO EFFECT*/ }
155 get { return scale; }
156 set { /* NO EFFECT*/ }
169 public string SourceColumn {
170 get { return srcColumn; }
171 set { srcColumn = value; }
174 [DefaultValue (DataRowVersion.Current)]
175 public DataRowVersion SourceVersion {
176 get { return srcVersion; }
177 set { srcVersion = value; }
180 [DefaultValue (null)]
181 [RefreshProperties (RefreshProperties.All)]
182 [TypeConverter (typeof(StringConverter))]
183 public object Value {
184 get { return this.value; }
185 set { this.value = value; }
188 #endregion // Properties
192 private void AssertSizeIsSet ()
195 throw new Exception ("Size must be set.");
198 internal void Bind (OciStatementHandle statement, OracleConnection connection)
200 if (bindHandle == null)
201 bindHandle = new OciBindHandle ((OciHandle) statement);
203 IntPtr tmpHandle = bindHandle.Handle;
205 if (Direction != ParameterDirection.Input)
212 OciDataType bindType = ociType;
213 IntPtr bindValue = IntPtr.Zero;
216 if (value == DBNull.Value)
219 bindType = OciDataType.VarChar2; // FIXME
220 bindValue = Marshal.StringToHGlobalAnsi (value.ToString ());
221 bindSize = value.ToString ().Length;
224 status = OciCalls.OCIBindByName (statement,
226 connection.ErrorHandle,
228 ParameterName.Length,
240 OciErrorInfo info = connection.ErrorHandle.HandleError ();
241 throw new OracleException (info.ErrorCode, info.ErrorMessage);
244 bindHandle.SetHandle (tmpHandle);
248 object ICloneable.Clone ()
250 throw new NotImplementedException ();
253 private void InferOracleType (object value)
255 Type type = value.GetType ();
256 string exception = String.Format ("The parameter data type of {0} is invalid.", type.Name);
257 switch (type.FullName) {
259 SetOracleType (OracleType.Number);
261 case "System.Boolean":
263 SetOracleType (OracleType.Byte);
265 case "System.String":
266 SetOracleType (OracleType.VarChar);
268 case "System.DataType":
269 SetOracleType (OracleType.DateTime);
271 case "System.Decimal":
272 SetOracleType (OracleType.Number);
273 //scale = ((decimal) value).Scale;
275 case "System.Double":
276 SetOracleType (OracleType.Double);
278 case "System.Byte[]":
280 SetOracleType (OracleType.Raw);
283 SetOracleType (OracleType.Int32);
285 case "System.Single":
286 SetOracleType (OracleType.Float);
289 SetOracleType (OracleType.Int16);
292 throw new ArgumentException (exception);
296 [MonoTODO ("different size depending on type.")]
297 private int InferSize ()
299 return value.ToString ().Length;
302 private void SetDbType (DbType type)
304 string exception = String.Format ("No mapping exists from DbType {0} to a known OracleType.", type);
306 case DbType.AnsiString:
307 oracleType = OracleType.VarChar;
308 ociType = OciDataType.VarChar;
310 case DbType.AnsiStringFixedLength:
311 oracleType = OracleType.Char;
312 ociType = OciDataType.Char;
316 oracleType = OracleType.Raw;
317 ociType = OciDataType.Raw;
321 oracleType = OracleType.Byte;
322 ociType = OciDataType.Integer;
324 case DbType.Currency:
327 oracleType = OracleType.Number;
328 ociType = OciDataType.Number;
331 case DbType.DateTime:
333 oracleType = OracleType.DateTime;
334 ociType = OciDataType.Char;
337 oracleType = OracleType.Double;
338 ociType = OciDataType.Float;
341 oracleType = OracleType.Int16;
342 ociType = OciDataType.Integer;
345 oracleType = OracleType.Int32;
346 ociType = OciDataType.Integer;
349 oracleType = OracleType.Blob;
350 ociType = OciDataType.Blob;
353 oracleType = OracleType.Float;
354 ociType = OciDataType.Float;
357 oracleType = OracleType.NVarChar;
358 ociType = OciDataType.VarChar;
360 case DbType.StringFixedLength:
361 oracleType = OracleType.NChar;
362 ociType = OciDataType.Char;
365 throw new ArgumentException (exception);
371 private void SetOracleType (OracleType type)
373 string exception = String.Format ("No mapping exists from OracleType {0} to a known DbType.", type);
375 case OracleType.BFile:
376 case OracleType.Blob:
377 case OracleType.LongRaw:
379 dbType = DbType.Binary;
380 ociType = OciDataType.Raw;
382 case OracleType.Byte:
383 dbType = DbType.Byte;
384 ociType = OciDataType.Integer;
386 case OracleType.Char:
387 dbType = DbType.AnsiStringFixedLength;
388 ociType = OciDataType.Char;
390 case OracleType.Clob:
391 case OracleType.LongVarChar:
392 case OracleType.RowId:
393 case OracleType.VarChar:
394 dbType = DbType.AnsiString;
395 ociType = OciDataType.VarChar;
397 case OracleType.Cursor:
398 case OracleType.IntervalDayToSecond:
399 dbType = DbType.Object;
400 ociType = OciDataType.Blob;
402 case OracleType.DateTime:
403 case OracleType.Timestamp:
404 case OracleType.TimestampLocal:
405 case OracleType.TimestampWithTZ:
406 dbType = DbType.DateTime;
407 ociType = OciDataType.Char;
409 case OracleType.Double:
410 dbType = DbType.Double;
411 ociType = OciDataType.Float;
413 case OracleType.Float:
414 dbType = DbType.Single;
415 ociType = OciDataType.Float;
417 case OracleType.Int16:
418 dbType = DbType.Int16;
419 ociType = OciDataType.Integer;
421 case OracleType.Int32:
422 case OracleType.IntervalYearToMonth:
423 dbType = DbType.Int32;
424 ociType = OciDataType.Integer;
426 case OracleType.NChar:
427 dbType = DbType.StringFixedLength;
428 ociType = OciDataType.Char;
430 case OracleType.NClob:
431 case OracleType.NVarChar:
432 dbType = DbType.String;
433 ociType = OciDataType.VarChar;
435 case OracleType.Number:
436 dbType = DbType.VarNumeric;
437 ociType = OciDataType.Number;
439 case OracleType.SByte:
440 dbType = DbType.SByte;
441 ociType = OciDataType.Integer;
443 case OracleType.UInt16:
444 dbType = DbType.UInt16;
445 ociType = OciDataType.Integer;
447 case OracleType.UInt32:
448 dbType = DbType.UInt32;
449 ociType = OciDataType.Integer;
452 throw new ArgumentException (exception);
458 public override string ToString ()
460 return ParameterName;
463 #endregion // Methods
465 internal sealed class OracleParameterConverter : ExpandableObjectConverter
467 public OracleParameterConverter ()
472 public override bool CanConvertTo (ITypeDescriptorContext context, Type destinationType)
474 throw new NotImplementedException ();
478 public override object ConvertTo (ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
480 throw new NotImplementedException ();