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 // Permission is hereby granted, free of charge, to any person obtaining
15 // a copy of this software and associated documentation files (the
16 // "Software"), to deal in the Software without restriction, including
17 // without limitation the rights to use, copy, modify, merge, publish,
18 // distribute, sublicense, and/or sell copies of the Software, and to
19 // permit persons to whom the Software is furnished to do so, subject to
20 // the following conditions:
22 // The above copyright notice and this permission notice shall be
23 // included in all copies or substantial portions of the Software.
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
29 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
30 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 using Mono
.Data
.Tds
.Protocol
;
37 using System
.ComponentModel
;
39 using System
.Data
.Common
;
40 using System
.Runtime
.InteropServices
;
43 namespace Mono
.Data
.SybaseClient
{
44 public sealed class SybaseParameter
: MarshalByRefObject
, IDbDataParameter
, IDataParameter
, ICloneable
48 TdsMetaParameter metaParameter
;
50 SybaseParameterCollection container
= null;
52 ParameterDirection direction
= ParameterDirection
.Input
;
54 bool isSizeSet
= false;
55 bool isTypeSet
= false;
57 SybaseType sybaseType
;
59 DataRowVersion sourceVersion
;
65 public SybaseParameter ()
66 : this (String
.Empty
, SybaseType
.NVarChar
, 0, ParameterDirection
.Input
, false, 0, 0, String
.Empty
, DataRowVersion
.Current
, null)
70 public SybaseParameter (string parameterName
, object value)
72 metaParameter
= new TdsMetaParameter (parameterName
, value);
73 this.sourceVersion
= DataRowVersion
.Current
;
74 InferSybaseType (value);
77 public SybaseParameter (string parameterName
, SybaseType dbType
)
78 : this (parameterName
, dbType
, 0, ParameterDirection
.Input
, false, 0, 0, String
.Empty
, DataRowVersion
.Current
, null)
82 public SybaseParameter (string parameterName
, SybaseType dbType
, int size
)
83 : this (parameterName
, dbType
, size
, ParameterDirection
.Input
, false, 0, 0, String
.Empty
, DataRowVersion
.Current
, null)
87 public SybaseParameter (string parameterName
, SybaseType dbType
, int size
, string sourceColumn
)
88 : this (parameterName
, dbType
, size
, ParameterDirection
.Input
, false, 0, 0, sourceColumn
, DataRowVersion
.Current
, null)
92 [EditorBrowsable (EditorBrowsableState
.Advanced
)]
93 public SybaseParameter (string parameterName
, SybaseType dbType
, int size
, ParameterDirection direction
, bool isNullable
, byte precision
, byte scale
, string sourceColumn
, DataRowVersion sourceVersion
, object value)
95 metaParameter
= new TdsMetaParameter (parameterName
, size
, isNullable
, precision
, scale
, value);
98 Direction
= direction
;
99 SourceColumn
= sourceColumn
;
100 SourceVersion
= sourceVersion
;
103 // This constructor is used internally to construct a
104 // SybaseParameter. The value array comes from sp_procedure_params_rowset.
105 // This is in SybaseCommand.DeriveParameters.
106 internal SybaseParameter (object[] dbValues
)
110 Direction
= ParameterDirection
.Input
;
112 ParameterName
= (string) dbValues
[3];
114 switch ((short) dbValues
[5]) {
116 Direction
= ParameterDirection
.Input
;
119 Direction
= ParameterDirection
.Output
;
122 Direction
= ParameterDirection
.InputOutput
;
125 Direction
= ParameterDirection
.ReturnValue
;
129 IsNullable
= (bool) dbValues
[8];
131 if (dbValues
[12] != null)
132 Precision
= (byte) ((short) dbValues
[12]);
133 if (dbValues
[13] != null)
134 Scale
= (byte) ((short) dbValues
[13]);
136 SetDbTypeName ((string) dbValues
[16]);
139 #endregion // Constructors
143 // Used to ensure that only one collection can contain this
145 internal SybaseParameterCollection Container
{
146 get { return container; }
147 set { container = value; }
150 public DbType DbType
{
151 get { return dbType; }
158 public ParameterDirection Direction
{
159 get { return direction; }
162 if (direction
== ParameterDirection
.Output
)
163 MetaParameter
.Direction
= TdsParameterDirection
.Output
;
167 internal TdsMetaParameter MetaParameter
{
168 get { return metaParameter; }
171 string IDataParameter
.ParameterName
{
172 get { return metaParameter.ParameterName; }
173 set { metaParameter.ParameterName = value; }
176 public bool IsNullable
{
177 get { return metaParameter.IsNullable; }
178 set { metaParameter.IsNullable = value; }
182 get { return offset; }
183 set { offset = value; }
186 public string ParameterName
{
187 get { return metaParameter.ParameterName; }
188 set { metaParameter.ParameterName = value; }
191 public byte Precision
{
192 get { return metaParameter.Precision; }
193 set { metaParameter.Precision = value; }
197 get { return metaParameter.Scale; }
198 set { metaParameter.Scale = value; }
202 get { return metaParameter.Size; }
203 set { metaParameter.Size = value; }
206 public string SourceColumn
{
207 get { return sourceColumn; }
208 set { sourceColumn = value; }
211 public DataRowVersion SourceVersion
{
212 get { return sourceVersion; }
213 set { sourceVersion = value; }
216 public SybaseType SybaseType
{
217 get { return sybaseType; }
219 SetSybaseType (value);
224 public object Value
{
225 get { return metaParameter.Value; }
228 InferSybaseType (value);
229 metaParameter
.Value
= value;
233 #endregion // Properties
237 object ICloneable
.Clone ()
239 return new SybaseParameter (ParameterName
, SybaseType
, Size
, Direction
, IsNullable
, Precision
, Scale
, SourceColumn
, SourceVersion
, Value
);
242 // If the value is set without the DbType/SybaseType being set, then we
243 // infer type information.
244 private void InferSybaseType (object value)
246 Type type
= value.GetType ();
248 string exception
= String
.Format ("The parameter data type of {0} is invalid.", type
.Name
);
250 switch (type
.FullName
) {
252 SetSybaseType (SybaseType
.BigInt
);
254 case "System.Boolean":
255 SetSybaseType (SybaseType
.Bit
);
257 case "System.String":
258 SetSybaseType (SybaseType
.NVarChar
);
260 case "System.DateTime":
261 SetSybaseType (SybaseType
.DateTime
);
263 case "System.Decimal":
264 SetSybaseType (SybaseType
.Decimal
);
266 case "System.Double":
267 SetSybaseType (SybaseType
.Float
);
269 case "System.Byte[]":
270 SetSybaseType (SybaseType
.VarBinary
);
273 SetSybaseType (SybaseType
.TinyInt
);
276 SetSybaseType (SybaseType
.Int
);
278 case "System.Single":
279 SetSybaseType (SybaseType
.Real
);
282 SetSybaseType (SybaseType
.SmallInt
);
285 SetSybaseType (SybaseType
.UniqueIdentifier
);
287 case "System.Object":
288 SetSybaseType (SybaseType
.Variant
);
291 throw new ArgumentException (exception
);
295 // When the DbType is set, we also set the SybaseType, as well as the SQL Server
296 // string representation of the type name. If the DbType is not convertible
297 // to an SybaseType, throw an exception.
298 private void SetDbType (DbType type
)
300 string exception
= String
.Format ("No mapping exists from DbType {0} to a known SybaseType.", type
);
303 case DbType
.AnsiString
:
304 MetaParameter
.TypeName
= "varchar";
305 sybaseType
= SybaseType
.VarChar
;
307 case DbType
.AnsiStringFixedLength
:
308 MetaParameter
.TypeName
= "char";
309 sybaseType
= SybaseType
.Char
;
312 MetaParameter
.TypeName
= "varbinary";
313 sybaseType
= SybaseType
.VarBinary
;
316 MetaParameter
.TypeName
= "bit";
317 sybaseType
= SybaseType
.Bit
;
320 MetaParameter
.TypeName
= "tinyint";
321 sybaseType
= SybaseType
.TinyInt
;
323 case DbType
.Currency
:
324 sybaseType
= SybaseType
.Money
;
325 MetaParameter
.TypeName
= "money";
328 case DbType
.DateTime
:
329 MetaParameter
.TypeName
= "datetime";
330 sybaseType
= SybaseType
.DateTime
;
333 MetaParameter
.TypeName
= "decimal";
334 sybaseType
= SybaseType
.Decimal
;
337 MetaParameter
.TypeName
= "float";
338 sybaseType
= SybaseType
.Float
;
341 MetaParameter
.TypeName
= "uniqueidentifier";
342 sybaseType
= SybaseType
.UniqueIdentifier
;
345 MetaParameter
.TypeName
= "smallint";
346 sybaseType
= SybaseType
.SmallInt
;
349 MetaParameter
.TypeName
= "int";
350 sybaseType
= SybaseType
.Int
;
353 MetaParameter
.TypeName
= "bigint";
354 sybaseType
= SybaseType
.BigInt
;
357 MetaParameter
.TypeName
= "sql_variant";
358 sybaseType
= SybaseType
.Variant
;
361 MetaParameter
.TypeName
= "real";
362 sybaseType
= SybaseType
.Real
;
365 MetaParameter
.TypeName
= "nvarchar";
366 sybaseType
= SybaseType
.NVarChar
;
368 case DbType
.StringFixedLength
:
369 MetaParameter
.TypeName
= "nchar";
370 sybaseType
= SybaseType
.NChar
;
373 MetaParameter
.TypeName
= "datetime";
374 sybaseType
= SybaseType
.DateTime
;
377 throw new ArgumentException (exception
);
382 // Used by internal constructor which has a SQL Server typename
383 private void SetDbTypeName (string dbTypeName
)
385 switch (dbTypeName
.ToLower ()) {
387 SybaseType
= SybaseType
.BigInt
;
390 SybaseType
= SybaseType
.Binary
;
393 SybaseType
= SybaseType
.Bit
;
396 SybaseType
= SybaseType
.Char
;
399 SybaseType
= SybaseType
.DateTime
;
402 SybaseType
= SybaseType
.Decimal
;
405 SybaseType
= SybaseType
.Float
;
408 SybaseType
= SybaseType
.Image
;
411 SybaseType
= SybaseType
.Int
;
414 SybaseType
= SybaseType
.Money
;
417 SybaseType
= SybaseType
.NChar
;
420 SybaseType
= SybaseType
.NText
;
423 SybaseType
= SybaseType
.NVarChar
;
426 SybaseType
= SybaseType
.Real
;
428 case "smalldatetime":
429 SybaseType
= SybaseType
.SmallDateTime
;
432 SybaseType
= SybaseType
.SmallInt
;
435 SybaseType
= SybaseType
.SmallMoney
;
438 SybaseType
= SybaseType
.Text
;
441 SybaseType
= SybaseType
.Timestamp
;
444 SybaseType
= SybaseType
.TinyInt
;
446 case "uniqueidentifier":
447 SybaseType
= SybaseType
.UniqueIdentifier
;
450 SybaseType
= SybaseType
.VarBinary
;
453 SybaseType
= SybaseType
.VarChar
;
456 SybaseType
= SybaseType
.Variant
;
461 // When the SybaseType is set, we also set the DbType, as well as the SQL Server
462 // string representation of the type name. If the SybaseType is not convertible
463 // to a DbType, throw an exception.
464 private void SetSybaseType (SybaseType type
)
466 string exception
= String
.Format ("No mapping exists from SybaseType {0} to a known DbType.", type
);
469 case SybaseType
.BigInt
:
470 MetaParameter
.TypeName
= "bigint";
471 dbType
= DbType
.Int64
;
473 case SybaseType
.Binary
:
474 MetaParameter
.TypeName
= "binary";
475 dbType
= DbType
.Binary
;
477 case SybaseType
.Timestamp
:
478 MetaParameter
.TypeName
= "timestamp";
479 dbType
= DbType
.Binary
;
481 case SybaseType
.VarBinary
:
482 MetaParameter
.TypeName
= "varbinary";
483 dbType
= DbType
.Binary
;
486 MetaParameter
.TypeName
= "bit";
487 dbType
= DbType
.Boolean
;
489 case SybaseType
.Char
:
490 MetaParameter
.TypeName
= "char";
491 dbType
= DbType
.AnsiStringFixedLength
;
493 case SybaseType
.DateTime
:
494 MetaParameter
.TypeName
= "datetime";
495 dbType
= DbType
.DateTime
;
497 case SybaseType
.SmallDateTime
:
498 MetaParameter
.TypeName
= "smalldatetime";
499 dbType
= DbType
.DateTime
;
501 case SybaseType
.Decimal
:
502 MetaParameter
.TypeName
= "decimal";
503 dbType
= DbType
.Decimal
;
505 case SybaseType
.Float
:
506 MetaParameter
.TypeName
= "float";
507 dbType
= DbType
.Double
;
509 case SybaseType
.Image
:
510 MetaParameter
.TypeName
= "image";
511 dbType
= DbType
.Binary
;
514 MetaParameter
.TypeName
= "int";
515 dbType
= DbType
.Int32
;
517 case SybaseType
.Money
:
518 MetaParameter
.TypeName
= "money";
519 dbType
= DbType
.Currency
;
521 case SybaseType
.SmallMoney
:
522 MetaParameter
.TypeName
= "smallmoney";
523 dbType
= DbType
.Currency
;
525 case SybaseType
.NChar
:
526 MetaParameter
.TypeName
= "nchar";
527 dbType
= DbType
.StringFixedLength
;
529 case SybaseType
.NText
:
530 MetaParameter
.TypeName
= "ntext";
531 dbType
= DbType
.String
;
533 case SybaseType
.NVarChar
:
534 MetaParameter
.TypeName
= "nvarchar";
535 dbType
= DbType
.String
;
537 case SybaseType
.Real
:
538 MetaParameter
.TypeName
= "real";
539 dbType
= DbType
.Single
;
541 case SybaseType
.SmallInt
:
542 MetaParameter
.TypeName
= "smallint";
543 dbType
= DbType
.Int16
;
545 case SybaseType
.Text
:
546 MetaParameter
.TypeName
= "text";
547 dbType
= DbType
.AnsiString
;
549 case SybaseType
.VarChar
:
550 MetaParameter
.TypeName
= "varchar";
551 dbType
= DbType
.AnsiString
;
553 case SybaseType
.TinyInt
:
554 MetaParameter
.TypeName
= "tinyint";
555 dbType
= DbType
.Byte
;
557 case SybaseType
.UniqueIdentifier
:
558 MetaParameter
.TypeName
= "uniqueidentifier";
559 dbType
= DbType
.Guid
;
561 case SybaseType
.Variant
:
562 MetaParameter
.TypeName
= "sql_variant";
563 dbType
= DbType
.Object
;
566 throw new ArgumentException (exception
);
571 public override string ToString()
573 return ParameterName
;
576 #endregion // Methods