2 // Mono.Data.SybaseClient.SybaseParameter.cs
5 // Rodrigo Moya (rodrigo@ximian.com)
6 // Daniel Morgan (danmorg@sc.rr.com)
7 // Tim Coleman (tim@timcoleman.com)
9 // (C) Ximian, Inc. 2002
10 // Copyright (C) Tim Coleman, 2002
14 using Mono.Data.Tds.Protocol;
16 using System.ComponentModel;
18 using System.Data.Common;
19 using System.Runtime.InteropServices;
22 namespace Mono.Data.SybaseClient {
23 public sealed class SybaseParameter : MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable
27 TdsMetaParameter metaParameter;
29 SybaseParameterCollection container = null;
31 ParameterDirection direction = ParameterDirection.Input;
33 bool isSizeSet = false;
34 bool isTypeSet = false;
36 SybaseType sybaseType;
38 DataRowVersion sourceVersion;
44 public SybaseParameter ()
45 : this (String.Empty, SybaseType.NVarChar, 0, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null)
49 public SybaseParameter (string parameterName, object value)
51 metaParameter = new TdsMetaParameter (parameterName, value);
52 this.sourceVersion = DataRowVersion.Current;
53 InferSybaseType (value);
56 public SybaseParameter (string parameterName, SybaseType dbType)
57 : this (parameterName, dbType, 0, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null)
61 public SybaseParameter (string parameterName, SybaseType dbType, int size)
62 : this (parameterName, dbType, size, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null)
66 public SybaseParameter (string parameterName, SybaseType dbType, int size, string sourceColumn)
67 : this (parameterName, dbType, size, ParameterDirection.Input, false, 0, 0, sourceColumn, DataRowVersion.Current, null)
71 [EditorBrowsable (EditorBrowsableState.Advanced)]
72 public SybaseParameter (string parameterName, SybaseType dbType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, object value)
74 metaParameter = new TdsMetaParameter (parameterName, size, isNullable, precision, scale, value);
77 Direction = direction;
78 SourceColumn = sourceColumn;
79 SourceVersion = sourceVersion;
82 // This constructor is used internally to construct a
83 // SybaseParameter. The value array comes from sp_procedure_params_rowset.
84 // This is in SybaseCommand.DeriveParameters.
85 internal SybaseParameter (object[] dbValues)
89 Direction = ParameterDirection.Input;
91 ParameterName = (string) dbValues[3];
93 switch ((short) dbValues[5]) {
95 Direction = ParameterDirection.Input;
98 Direction = ParameterDirection.Output;
101 Direction = ParameterDirection.InputOutput;
104 Direction = ParameterDirection.ReturnValue;
108 IsNullable = (bool) dbValues[8];
110 if (dbValues[12] != null)
111 Precision = (byte) ((short) dbValues[12]);
112 if (dbValues[13] != null)
113 Scale = (byte) ((short) dbValues[13]);
115 SetDbTypeName ((string) dbValues[16]);
118 #endregion // Constructors
122 // Used to ensure that only one collection can contain this
124 internal SybaseParameterCollection Container {
125 get { return container; }
126 set { container = value; }
129 public DbType DbType {
130 get { return dbType; }
137 public ParameterDirection Direction {
138 get { return direction; }
141 if (direction == ParameterDirection.Output)
142 MetaParameter.Direction = TdsParameterDirection.Output;
146 internal TdsMetaParameter MetaParameter {
147 get { return metaParameter; }
150 string IDataParameter.ParameterName {
151 get { return metaParameter.ParameterName; }
152 set { metaParameter.ParameterName = value; }
155 public bool IsNullable {
156 get { return metaParameter.IsNullable; }
157 set { metaParameter.IsNullable = value; }
161 get { return offset; }
162 set { offset = value; }
165 public string ParameterName {
166 get { return metaParameter.ParameterName; }
167 set { metaParameter.ParameterName = value; }
170 public byte Precision {
171 get { return metaParameter.Precision; }
172 set { metaParameter.Precision = value; }
176 get { return metaParameter.Scale; }
177 set { metaParameter.Scale = value; }
181 get { return metaParameter.Size; }
182 set { metaParameter.Size = value; }
185 public string SourceColumn {
186 get { return sourceColumn; }
187 set { sourceColumn = value; }
190 public DataRowVersion SourceVersion {
191 get { return sourceVersion; }
192 set { sourceVersion = value; }
195 public SybaseType SybaseType {
196 get { return sybaseType; }
198 SetSybaseType (value);
203 public object Value {
204 get { return metaParameter.Value; }
207 InferSybaseType (value);
208 metaParameter.Value = value;
212 #endregion // Properties
216 object ICloneable.Clone ()
218 return new SybaseParameter (ParameterName, SybaseType, Size, Direction, IsNullable, Precision, Scale, SourceColumn, SourceVersion, Value);
221 // If the value is set without the DbType/SybaseType being set, then we
222 // infer type information.
223 private void InferSybaseType (object value)
225 Type type = value.GetType ();
227 string exception = String.Format ("The parameter data type of {0} is invalid.", type.Name);
229 switch (type.FullName) {
231 SetSybaseType (SybaseType.BigInt);
233 case "System.Boolean":
234 SetSybaseType (SybaseType.Bit);
236 case "System.String":
237 SetSybaseType (SybaseType.NVarChar);
239 case "System.DateTime":
240 SetSybaseType (SybaseType.DateTime);
242 case "System.Decimal":
243 SetSybaseType (SybaseType.Decimal);
245 case "System.Double":
246 SetSybaseType (SybaseType.Float);
248 case "System.Byte[]":
249 SetSybaseType (SybaseType.VarBinary);
252 SetSybaseType (SybaseType.TinyInt);
255 SetSybaseType (SybaseType.Int);
257 case "System.Single":
258 SetSybaseType (SybaseType.Real);
261 SetSybaseType (SybaseType.SmallInt);
264 SetSybaseType (SybaseType.UniqueIdentifier);
266 case "System.Object":
267 SetSybaseType (SybaseType.Variant);
270 throw new ArgumentException (exception);
274 // When the DbType is set, we also set the SybaseType, as well as the SQL Server
275 // string representation of the type name. If the DbType is not convertible
276 // to an SybaseType, throw an exception.
277 private void SetDbType (DbType type)
279 string exception = String.Format ("No mapping exists from DbType {0} to a known SybaseType.", type);
282 case DbType.AnsiString:
283 MetaParameter.TypeName = "varchar";
284 sybaseType = SybaseType.VarChar;
286 case DbType.AnsiStringFixedLength:
287 MetaParameter.TypeName = "char";
288 sybaseType = SybaseType.Char;
291 MetaParameter.TypeName = "varbinary";
292 sybaseType = SybaseType.VarBinary;
295 MetaParameter.TypeName = "bit";
296 sybaseType = SybaseType.Bit;
299 MetaParameter.TypeName = "tinyint";
300 sybaseType = SybaseType.TinyInt;
302 case DbType.Currency:
303 sybaseType = SybaseType.Money;
304 MetaParameter.TypeName = "money";
307 case DbType.DateTime:
308 MetaParameter.TypeName = "datetime";
309 sybaseType = SybaseType.DateTime;
312 MetaParameter.TypeName = "decimal";
313 sybaseType = SybaseType.Decimal;
316 MetaParameter.TypeName = "float";
317 sybaseType = SybaseType.Float;
320 MetaParameter.TypeName = "uniqueidentifier";
321 sybaseType = SybaseType.UniqueIdentifier;
324 MetaParameter.TypeName = "smallint";
325 sybaseType = SybaseType.SmallInt;
328 MetaParameter.TypeName = "int";
329 sybaseType = SybaseType.Int;
332 MetaParameter.TypeName = "bigint";
333 sybaseType = SybaseType.BigInt;
336 MetaParameter.TypeName = "sql_variant";
337 sybaseType = SybaseType.Variant;
340 MetaParameter.TypeName = "real";
341 sybaseType = SybaseType.Real;
344 MetaParameter.TypeName = "nvarchar";
345 sybaseType = SybaseType.NVarChar;
347 case DbType.StringFixedLength:
348 MetaParameter.TypeName = "nchar";
349 sybaseType = SybaseType.NChar;
352 MetaParameter.TypeName = "datetime";
353 sybaseType = SybaseType.DateTime;
356 throw new ArgumentException (exception);
361 // Used by internal constructor which has a SQL Server typename
362 private void SetDbTypeName (string dbTypeName)
364 switch (dbTypeName.ToLower ()) {
366 SybaseType = SybaseType.BigInt;
369 SybaseType = SybaseType.Binary;
372 SybaseType = SybaseType.Bit;
375 SybaseType = SybaseType.Char;
378 SybaseType = SybaseType.DateTime;
381 SybaseType = SybaseType.Decimal;
384 SybaseType = SybaseType.Float;
387 SybaseType = SybaseType.Image;
390 SybaseType = SybaseType.Int;
393 SybaseType = SybaseType.Money;
396 SybaseType = SybaseType.NChar;
399 SybaseType = SybaseType.NText;
402 SybaseType = SybaseType.NVarChar;
405 SybaseType = SybaseType.Real;
407 case "smalldatetime":
408 SybaseType = SybaseType.SmallDateTime;
411 SybaseType = SybaseType.SmallInt;
414 SybaseType = SybaseType.SmallMoney;
417 SybaseType = SybaseType.Text;
420 SybaseType = SybaseType.Timestamp;
423 SybaseType = SybaseType.TinyInt;
425 case "uniqueidentifier":
426 SybaseType = SybaseType.UniqueIdentifier;
429 SybaseType = SybaseType.VarBinary;
432 SybaseType = SybaseType.VarChar;
435 SybaseType = SybaseType.Variant;
440 // When the SybaseType is set, we also set the DbType, as well as the SQL Server
441 // string representation of the type name. If the SybaseType is not convertible
442 // to a DbType, throw an exception.
443 private void SetSybaseType (SybaseType type)
445 string exception = String.Format ("No mapping exists from SybaseType {0} to a known DbType.", type);
448 case SybaseType.BigInt:
449 MetaParameter.TypeName = "bigint";
450 dbType = DbType.Int64;
452 case SybaseType.Binary:
453 MetaParameter.TypeName = "binary";
454 dbType = DbType.Binary;
456 case SybaseType.Timestamp:
457 MetaParameter.TypeName = "timestamp";
458 dbType = DbType.Binary;
460 case SybaseType.VarBinary:
461 MetaParameter.TypeName = "varbinary";
462 dbType = DbType.Binary;
465 MetaParameter.TypeName = "bit";
466 dbType = DbType.Boolean;
468 case SybaseType.Char:
469 MetaParameter.TypeName = "char";
470 dbType = DbType.AnsiStringFixedLength;
472 case SybaseType.DateTime:
473 MetaParameter.TypeName = "datetime";
474 dbType = DbType.DateTime;
476 case SybaseType.SmallDateTime:
477 MetaParameter.TypeName = "smalldatetime";
478 dbType = DbType.DateTime;
480 case SybaseType.Decimal:
481 MetaParameter.TypeName = "decimal";
482 dbType = DbType.Decimal;
484 case SybaseType.Float:
485 MetaParameter.TypeName = "float";
486 dbType = DbType.Double;
488 case SybaseType.Image:
489 MetaParameter.TypeName = "image";
490 dbType = DbType.Binary;
493 MetaParameter.TypeName = "int";
494 dbType = DbType.Int32;
496 case SybaseType.Money:
497 MetaParameter.TypeName = "money";
498 dbType = DbType.Currency;
500 case SybaseType.SmallMoney:
501 MetaParameter.TypeName = "smallmoney";
502 dbType = DbType.Currency;
504 case SybaseType.NChar:
505 MetaParameter.TypeName = "nchar";
506 dbType = DbType.StringFixedLength;
508 case SybaseType.NText:
509 MetaParameter.TypeName = "ntext";
510 dbType = DbType.String;
512 case SybaseType.NVarChar:
513 MetaParameter.TypeName = "nvarchar";
514 dbType = DbType.String;
516 case SybaseType.Real:
517 MetaParameter.TypeName = "real";
518 dbType = DbType.Single;
520 case SybaseType.SmallInt:
521 MetaParameter.TypeName = "smallint";
522 dbType = DbType.Int16;
524 case SybaseType.Text:
525 MetaParameter.TypeName = "text";
526 dbType = DbType.AnsiString;
528 case SybaseType.VarChar:
529 MetaParameter.TypeName = "varchar";
530 dbType = DbType.AnsiString;
532 case SybaseType.TinyInt:
533 MetaParameter.TypeName = "tinyint";
534 dbType = DbType.Byte;
536 case SybaseType.UniqueIdentifier:
537 MetaParameter.TypeName = "uniqueidentifier";
538 dbType = DbType.Guid;
540 case SybaseType.Variant:
541 MetaParameter.TypeName = "sql_variant";
542 dbType = DbType.Object;
545 throw new ArgumentException (exception);
550 public override string ToString()
552 return ParameterName;
555 #endregion // Methods