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 ();