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.Runtime.InteropServices;
25 namespace System.Data.OracleClient {
26 public sealed class OracleParameter : MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable
31 OracleType oracleType = OracleType.VarChar;
34 ParameterDirection direction = ParameterDirection.Input;
39 DataRowVersion srcVersion;
40 DbType dbType = DbType.AnsiString;
45 OracleParameterCollection container = null;
46 OciBindHandle bindHandle;
52 public OracleParameter ()
53 : this (String.Empty, OracleType.VarChar, 0, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null)
57 public OracleParameter (string name, object value)
61 SourceVersion = DataRowVersion.Current;
62 InferOracleType (value);
65 public OracleParameter (string name, OracleType dataType)
66 : this (name, dataType, 0, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null)
70 public OracleParameter (string name, OracleType dataType, int size)
71 : this (name, dataType, size, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null)
75 public OracleParameter (string name, OracleType dataType, int size, string srcColumn)
76 : this (name, dataType, size, ParameterDirection.Input, false, 0, 0, srcColumn, DataRowVersion.Current, null)
80 public OracleParameter (string name, OracleType dataType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value)
86 OracleType = dataType;
87 Direction = direction;
88 SourceColumn = srcColumn;
89 SourceVersion = srcVersion;
92 #endregion // Constructors
96 internal OracleParameterCollection Container {
97 get { return container; }
98 set { container = value; }
101 public DbType DbType {
102 get { return dbType; }
103 set { SetDbType (value); }
106 public ParameterDirection Direction {
107 get { return direction; }
108 set { direction = value; }
111 public bool IsNullable {
112 get { return isNullable; }
113 set { isNullable = value; }
117 get { return offset; }
118 set { offset = value; }
121 public OracleType OracleType {
122 get { return oracleType; }
123 set { SetOracleType (value); }
126 public string ParameterName {
128 set { name = value; }
131 public byte Precision {
132 get { return precision; }
133 set { /* NO EFFECT*/ }
137 get { return scale; }
138 set { /* NO EFFECT*/ }
149 public string SourceColumn {
150 get { return srcColumn; }
151 set { srcColumn = value; }
154 public DataRowVersion SourceVersion {
155 get { return srcVersion; }
156 set { srcVersion = value; }
159 public object Value {
160 get { return this.value; }
161 set { this.value = value; }
164 #endregion // Properties
169 static extern int OCIBindByName (IntPtr stmtp,
176 [MarshalAs (UnmanagedType.U2)] OciDataType dty,
185 private void AssertSizeIsSet ()
188 throw new Exception ("Size must be set.");
191 internal void Bind (OciStatementHandle statement, OracleConnection connection)
193 if (bindHandle == null)
194 bindHandle = new OciBindHandle ((OciHandle) statement);
196 IntPtr tmpHandle = bindHandle.Handle;
198 if (Direction != ParameterDirection.Input)
205 OciDataType bindType = ociType;
206 IntPtr bindValue = IntPtr.Zero;
209 if (value == DBNull.Value)
212 bindType = OciDataType.VarChar2; // FIXME
213 bindValue = Marshal.StringToHGlobalAnsi (value.ToString ());
214 bindSize = value.ToString ().Length;
217 status = OCIBindByName (statement,
219 connection.ErrorHandle,
221 ParameterName.Length,
233 OciErrorInfo info = connection.ErrorHandle.HandleError ();
234 throw new OracleException (info.ErrorCode, info.ErrorMessage);
237 bindHandle.SetHandle (tmpHandle);
241 object ICloneable.Clone ()
243 throw new NotImplementedException ();
246 private void InferOracleType (object value)
248 Type type = value.GetType ();
249 string exception = String.Format ("The parameter data type of {0} is invalid.", type.Name);
250 switch (type.FullName) {
252 SetOracleType (OracleType.Number);
254 case "System.Boolean":
256 SetOracleType (OracleType.Byte);
258 case "System.String":
259 SetOracleType (OracleType.VarChar);
261 case "System.DataType":
262 SetOracleType (OracleType.DateTime);
264 case "System.Decimal":
265 SetOracleType (OracleType.Number);
266 //scale = ((decimal) value).Scale;
268 case "System.Double":
269 SetOracleType (OracleType.Double);
271 case "System.Byte[]":
273 SetOracleType (OracleType.Raw);
276 SetOracleType (OracleType.Int32);
278 case "System.Single":
279 SetOracleType (OracleType.Float);
282 SetOracleType (OracleType.Int16);
285 throw new ArgumentException (exception);
289 [MonoTODO ("different size depending on type.")]
290 private int InferSize ()
292 return value.ToString ().Length;
295 public void SetDbType (DbType type)
297 string exception = String.Format ("No mapping exists from DbType {0} to a known OracleType.", type);
299 case DbType.AnsiString:
300 oracleType = OracleType.VarChar;
301 ociType = OciDataType.VarChar;
303 case DbType.AnsiStringFixedLength:
304 oracleType = OracleType.Char;
305 ociType = OciDataType.Char;
309 oracleType = OracleType.Raw;
310 ociType = OciDataType.Raw;
314 oracleType = OracleType.Byte;
315 ociType = OciDataType.Integer;
317 case DbType.Currency:
320 oracleType = OracleType.Number;
321 ociType = OciDataType.Number;
324 case DbType.DateTime:
326 oracleType = OracleType.DateTime;
327 ociType = OciDataType.Char;
330 oracleType = OracleType.Double;
331 ociType = OciDataType.Float;
334 oracleType = OracleType.Int16;
335 ociType = OciDataType.Integer;
338 oracleType = OracleType.Int32;
339 ociType = OciDataType.Integer;
342 oracleType = OracleType.Blob;
343 ociType = OciDataType.Blob;
346 oracleType = OracleType.Float;
347 ociType = OciDataType.Float;
350 oracleType = OracleType.NVarChar;
351 ociType = OciDataType.VarChar;
353 case DbType.StringFixedLength:
354 oracleType = OracleType.NChar;
355 ociType = OciDataType.Char;
358 throw new ArgumentException (exception);
364 public void SetOracleType (OracleType type)
366 string exception = String.Format ("No mapping exists from OracleType {0} to a known DbType.", type);
368 case OracleType.BFile:
369 case OracleType.Blob:
370 case OracleType.LongRaw:
372 dbType = DbType.Binary;
373 ociType = OciDataType.Raw;
375 case OracleType.Byte:
376 dbType = DbType.Byte;
377 ociType = OciDataType.Integer;
379 case OracleType.Char:
380 dbType = DbType.AnsiStringFixedLength;
381 ociType = OciDataType.Char;
383 case OracleType.Clob:
384 case OracleType.LongVarChar:
385 case OracleType.RowId:
386 case OracleType.VarChar:
387 dbType = DbType.AnsiString;
388 ociType = OciDataType.VarChar;
390 case OracleType.Cursor:
391 case OracleType.IntervalDayToSecond:
392 dbType = DbType.Object;
393 ociType = OciDataType.Blob;
395 case OracleType.DateTime:
396 case OracleType.Timestamp:
397 case OracleType.TimestampLocal:
398 case OracleType.TimestampWithTZ:
399 dbType = DbType.DateTime;
400 ociType = OciDataType.Char;
402 case OracleType.Double:
403 dbType = DbType.Double;
404 ociType = OciDataType.Float;
406 case OracleType.Float:
407 dbType = DbType.Single;
408 ociType = OciDataType.Float;
410 case OracleType.Int16:
411 dbType = DbType.Int16;
412 ociType = OciDataType.Integer;
414 case OracleType.Int32:
415 case OracleType.IntervalYearToMonth:
416 dbType = DbType.Int32;
417 ociType = OciDataType.Integer;
419 case OracleType.NChar:
420 dbType = DbType.StringFixedLength;
421 ociType = OciDataType.Char;
423 case OracleType.NClob:
424 case OracleType.NVarChar:
425 dbType = DbType.String;
426 ociType = OciDataType.VarChar;
428 case OracleType.Number:
429 dbType = DbType.VarNumeric;
430 ociType = OciDataType.Number;
432 case OracleType.SByte:
433 dbType = DbType.SByte;
434 ociType = OciDataType.Integer;
436 case OracleType.UInt16:
437 dbType = DbType.UInt16;
438 ociType = OciDataType.Integer;
440 case OracleType.UInt32:
441 dbType = DbType.UInt32;
442 ociType = OciDataType.Integer;
445 throw new ArgumentException (exception);
451 public override string ToString ()
453 return ParameterName;
456 #endregion // Methods