2 // Mono.Data.SybaseClient.SybaseDataReader.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 // (C) Daniel Morgan 2002
11 // Copyright (C) Tim Coleman, 2002
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 using Mono
.Data
.SybaseTypes
;
36 using Mono
.Data
.Tds
.Protocol
;
38 using System
.Collections
;
39 using System
.ComponentModel
;
41 using System
.Data
.Common
;
43 namespace Mono
.Data
.SybaseClient
{
44 public sealed class SybaseDataReader
: MarshalByRefObject
, IEnumerable
, IDataReader
, IDisposable
, IDataRecord
48 SybaseCommand command
;
49 ArrayList dataTypeNames
;
50 bool disposed
= false;
57 DataTable schemaTable
;
63 internal SybaseDataReader (SybaseCommand command
)
65 this.command
= command
;
66 schemaTable
= ConstructSchemaTable ();
70 isSelect
= (command
.CommandText
.Trim ().ToUpper ().StartsWith ("SELECT"));
71 command
.Tds
.RecordsAffected
= 0;
75 #endregion // Constructors
83 public int FieldCount
{
84 get { return fieldCount; }
87 public bool IsClosed
{
88 get { return isClosed; }
91 public object this [int i
] {
92 get { return GetValue (i); }
95 public object this [string name
] {
96 get { return GetValue (GetOrdinal (name)); }
99 public int RecordsAffected
{
104 return command
.Tds
.RecordsAffected
;
108 #endregion // Properties
115 command
.CloseDataReader (moreResults
);
118 private static DataTable
ConstructSchemaTable ()
120 Type booleanType
= Type
.GetType ("System.Boolean");
121 Type stringType
= Type
.GetType ("System.String");
122 Type intType
= Type
.GetType ("System.Int32");
123 Type typeType
= Type
.GetType ("System.Type");
124 Type shortType
= Type
.GetType ("System.Int16");
126 DataTable schemaTable
= new DataTable ("SchemaTable");
127 schemaTable
.Columns
.Add ("ColumnName", stringType
);
128 schemaTable
.Columns
.Add ("ColumnOrdinal", intType
);
129 schemaTable
.Columns
.Add ("ColumnSize", intType
);
130 schemaTable
.Columns
.Add ("NumericPrecision", shortType
);
131 schemaTable
.Columns
.Add ("NumericScale", shortType
);
132 schemaTable
.Columns
.Add ("IsUnique", booleanType
);
133 schemaTable
.Columns
.Add ("IsKey", booleanType
);
134 schemaTable
.Columns
.Add ("BaseServerName", stringType
);
135 schemaTable
.Columns
.Add ("BaseCatalogName", stringType
);
136 schemaTable
.Columns
.Add ("BaseColumnName", stringType
);
137 schemaTable
.Columns
.Add ("BaseSchemaName", stringType
);
138 schemaTable
.Columns
.Add ("BaseTableName", stringType
);
139 schemaTable
.Columns
.Add ("DataType", typeType
);
140 schemaTable
.Columns
.Add ("AllowDBNull", booleanType
);
141 schemaTable
.Columns
.Add ("ProviderType", intType
);
142 schemaTable
.Columns
.Add ("IsAliased", booleanType
);
143 schemaTable
.Columns
.Add ("IsExpression", booleanType
);
144 schemaTable
.Columns
.Add ("IsIdentity", booleanType
);
145 schemaTable
.Columns
.Add ("IsAutoIncrement", booleanType
);
146 schemaTable
.Columns
.Add ("IsRowVersion", booleanType
);
147 schemaTable
.Columns
.Add ("IsHidden", booleanType
);
148 schemaTable
.Columns
.Add ("IsLong", booleanType
);
149 schemaTable
.Columns
.Add ("IsReadOnly", booleanType
);
154 private void Dispose (bool disposing
)
158 schemaTable
.Dispose ();
165 public bool GetBoolean (int i
)
167 object value = GetValue (i
);
168 if (!(value is bool)) {
169 if (value is DBNull
) throw new SybaseNullValueException ();
170 throw new InvalidCastException ();
175 public byte GetByte (int i
)
177 object value = GetValue (i
);
178 if (!(value is byte)) {
179 if (value is DBNull
) throw new SybaseNullValueException ();
180 throw new InvalidCastException ();
185 public long GetBytes (int i
, long dataIndex
, byte[] buffer
, int bufferIndex
, int length
)
187 object value = GetValue (i
);
188 if (!(value is byte [])) {
189 if (value is DBNull
) throw new SybaseNullValueException ();
190 throw new InvalidCastException ();
192 Array
.Copy ((byte []) value, (int) dataIndex
, buffer
, bufferIndex
, length
);
193 return ((byte []) value).Length
- dataIndex
;
196 public char GetChar (int i
)
198 object value = GetValue (i
);
199 if (!(value is char)) {
200 if (value is DBNull
) throw new SybaseNullValueException ();
201 throw new InvalidCastException ();
206 public long GetChars (int i
, long dataIndex
, char[] buffer
, int bufferIndex
, int length
)
208 object value = GetValue (i
);
209 if (!(value is char[])) {
210 if (value is DBNull
) throw new SybaseNullValueException ();
211 throw new InvalidCastException ();
213 Array
.Copy ((char []) value, (int) dataIndex
, buffer
, bufferIndex
, length
);
214 return ((char []) value).Length
- dataIndex
;
217 [MonoTODO ("Implement GetData")]
218 public IDataReader
GetData (int i
)
220 throw new NotImplementedException ();
223 public string GetDataTypeName (int i
)
225 return (string) dataTypeNames
[i
];
228 public DateTime
GetDateTime (int i
)
230 object value = GetValue (i
);
231 if (!(value is DateTime
)) {
232 if (value is DBNull
) throw new SybaseNullValueException ();
233 throw new InvalidCastException ();
235 return (DateTime
) value;
238 public decimal GetDecimal (int i
)
240 object value = GetValue (i
);
241 if (!(value is decimal)) {
242 if (value is DBNull
) throw new SybaseNullValueException ();
243 throw new InvalidCastException ();
245 return (decimal) value;
248 public double GetDouble (int i
)
250 object value = GetValue (i
);
251 if (!(value is double)) {
252 if (value is DBNull
) throw new SybaseNullValueException ();
253 throw new InvalidCastException ();
255 return (double) value;
258 public Type
GetFieldType (int i
)
260 return (Type
) schemaTable
.Rows
[i
]["DataType"];
263 public float GetFloat (int i
)
265 object value = GetValue (i
);
266 if (!(value is float)) {
267 if (value is DBNull
) throw new SybaseNullValueException ();
268 throw new InvalidCastException ();
270 return (float) value;
273 public Guid
GetGuid (int i
)
275 object value = GetValue (i
);
276 if (!(value is Guid
)) {
277 if (value is DBNull
) throw new SybaseNullValueException ();
278 throw new InvalidCastException ();
283 public short GetInt16 (int i
)
285 object value = GetValue (i
);
286 if (!(value is short)) {
287 if (value is DBNull
) throw new SybaseNullValueException ();
288 throw new InvalidCastException ();
290 return (short) value;
293 public int GetInt32 (int i
)
295 object value = GetValue (i
);
296 if (!(value is int)) {
297 if (value is DBNull
) throw new SybaseNullValueException ();
298 throw new InvalidCastException ();
303 public long GetInt64 (int i
)
305 object value = GetValue (i
);
306 if (!(value is long)) {
307 if (value is DBNull
) throw new SybaseNullValueException ();
308 throw new InvalidCastException ();
313 public string GetName (int i
)
315 return (string) schemaTable
.Rows
[i
]["ColumnName"];
318 public int GetOrdinal (string name
)
320 foreach (DataRow schemaRow
in schemaTable
.Rows
)
321 if (((string) schemaRow
["ColumnName"]).Equals (name
))
322 return (int) schemaRow
["ColumnOrdinal"];
323 foreach (DataRow schemaRow
in schemaTable
.Rows
)
324 if (String
.Compare (((string) schemaRow
["ColumnName"]), name
, true) == 0)
325 return (int) schemaRow
["ColumnOrdinal"];
326 throw new IndexOutOfRangeException ();
329 public DataTable
GetSchemaTable ()
331 if (schemaTable
.Rows
!= null && schemaTable
.Rows
.Count
> 0)
339 dataTypeNames
= new ArrayList ();
341 foreach (TdsDataColumn schema
in command
.Tds
.Columns
) {
342 DataRow row
= schemaTable
.NewRow ();
344 row
["ColumnName"] = GetSchemaValue (schema
, "ColumnName");
345 row
["ColumnSize"] = GetSchemaValue (schema
, "ColumnSize");
346 row
["ColumnOrdinal"] = GetSchemaValue (schema
, "ColumnOrdinal");
347 row
["NumericPrecision"] = GetSchemaValue (schema
, "NumericPrecision");
348 row
["NumericScale"] = GetSchemaValue (schema
, "NumericScale");
349 row
["IsUnique"] = GetSchemaValue (schema
, "IsUnique");
350 row
["IsKey"] = GetSchemaValue (schema
, "IsKey");
351 row
["BaseServerName"] = GetSchemaValue (schema
, "BaseServerName");
352 row
["BaseCatalogName"] = GetSchemaValue (schema
, "BaseCatalogName");
353 row
["BaseColumnName"] = GetSchemaValue (schema
, "BaseColumnName");
354 row
["BaseSchemaName"] = GetSchemaValue (schema
, "BaseSchemaName");
355 row
["BaseTableName"] = GetSchemaValue (schema
, "BaseTableName");
356 row
["AllowDBNull"] = GetSchemaValue (schema
, "AllowDBNull");
357 row
["IsAliased"] = GetSchemaValue (schema
, "IsAliased");
358 row
["IsExpression"] = GetSchemaValue (schema
, "IsExpression");
359 row
["IsIdentity"] = GetSchemaValue (schema
, "IsIdentity");
360 row
["IsAutoIncrement"] = GetSchemaValue (schema
, "IsAutoIncrement");
361 row
["IsRowVersion"] = GetSchemaValue (schema
, "IsRowVersion");
362 row
["IsHidden"] = GetSchemaValue (schema
, "IsHidden");
363 row
["IsReadOnly"] = GetSchemaValue (schema
, "IsReadOnly");
365 // We don't always get the base column name.
366 if (row
["BaseColumnName"] == DBNull
.Value
)
367 row
["BaseColumnName"] = row
["ColumnName"];
369 switch ((TdsColumnType
) schema
["ColumnType"]) {
370 case TdsColumnType
.Image
:
371 dataTypeNames
.Add ("image");
372 row
["ProviderType"] = (int) SybaseType
.Image
;
373 row
["DataType"] = typeof (byte[]);
374 row
["IsLong"] = true;
376 case TdsColumnType
.Text
:
377 dataTypeNames
.Add ("text");
378 row
["ProviderType"] = (int) SybaseType
.Text
;
379 row
["DataType"] = typeof (string);
380 row
["IsLong"] = true;
382 case TdsColumnType
.UniqueIdentifier
:
383 dataTypeNames
.Add ("uniqueidentifier");
384 row
["ProviderType"] = (int) SybaseType
.UniqueIdentifier
;
385 row
["DataType"] = typeof (Guid
);
386 row
["IsLong"] = false;
388 case TdsColumnType
.VarBinary
:
389 case TdsColumnType
.BigVarBinary
:
390 dataTypeNames
.Add ("varbinary");
391 row
["ProviderType"] = (int) SybaseType
.VarBinary
;
392 row
["DataType"] = typeof (byte[]);
393 row
["IsLong"] = true;
395 case TdsColumnType
.IntN
:
396 case TdsColumnType
.Int4
:
397 dataTypeNames
.Add ("int");
398 row
["ProviderType"] = (int) SybaseType
.Int
;
399 row
["DataType"] = typeof (int);
400 row
["IsLong"] = false;
402 case TdsColumnType
.VarChar
:
403 case TdsColumnType
.BigVarChar
:
404 dataTypeNames
.Add ("varchar");
405 row
["ProviderType"] = (int) SybaseType
.VarChar
;
406 row
["DataType"] = typeof (string);
407 row
["IsLong"] = false;
409 case TdsColumnType
.Binary
:
410 case TdsColumnType
.BigBinary
:
411 dataTypeNames
.Add ("binary");
412 row
["ProviderType"] = (int) SybaseType
.Binary
;
413 row
["DataType"] = typeof (byte[]);
414 row
["IsLong"] = true;
416 case TdsColumnType
.Char
:
417 case TdsColumnType
.BigChar
:
418 dataTypeNames
.Add ("char");
419 row
["ProviderType"] = (int) SybaseType
.Char
;
420 row
["DataType"] = typeof (string);
421 row
["IsLong"] = false;
423 case TdsColumnType
.Int1
:
424 dataTypeNames
.Add ("tinyint");
425 row
["ProviderType"] = (int) SybaseType
.TinyInt
;
426 row
["DataType"] = typeof (byte);
427 row
["IsLong"] = false;
429 case TdsColumnType
.Bit
:
430 case TdsColumnType
.BitN
:
431 dataTypeNames
.Add ("bit");
432 row
["ProviderType"] = (int) SybaseType
.Bit
;
433 row
["DataType"] = typeof (bool);
434 row
["IsLong"] = false;
436 case TdsColumnType
.Int2
:
437 dataTypeNames
.Add ("smallint");
438 row
["ProviderType"] = (int) SybaseType
.SmallInt
;
439 row
["DataType"] = typeof (short);
440 row
["IsLong"] = false;
442 case TdsColumnType
.DateTime4
:
443 case TdsColumnType
.DateTime
:
444 case TdsColumnType
.DateTimeN
:
445 dataTypeNames
.Add ("datetime");
446 row
["ProviderType"] = (int) SybaseType
.DateTime
;
447 row
["DataType"] = typeof (DateTime
);
448 row
["IsLong"] = false;
450 case TdsColumnType
.Real
:
451 dataTypeNames
.Add ("real");
452 row
["ProviderType"] = (int) SybaseType
.Real
;
453 row
["DataType"] = typeof (float);
455 case TdsColumnType
.Money
:
456 case TdsColumnType
.MoneyN
:
457 case TdsColumnType
.Money4
:
458 dataTypeNames
.Add ("money");
459 row
["ProviderType"] = (int) SybaseType
.Money
;
460 row
["DataType"] = typeof (decimal);
461 row
["IsLong"] = false;
463 case TdsColumnType
.Float8
:
464 case TdsColumnType
.FloatN
:
465 dataTypeNames
.Add ("float");
466 row
["ProviderType"] = (int) SybaseType
.Float
;
467 row
["DataType"] = typeof (double);
468 row
["IsLong"] = false;
470 case TdsColumnType
.NText
:
471 dataTypeNames
.Add ("ntext");
472 row
["ProviderType"] = (int) SybaseType
.NText
;
473 row
["DataType"] = typeof (string);
474 row
["IsLong"] = true;
476 case TdsColumnType
.NVarChar
:
477 dataTypeNames
.Add ("nvarchar");
478 row
["ProviderType"] = (int) SybaseType
.NVarChar
;
479 row
["DataType"] = typeof (string);
480 row
["IsLong"] = false;
482 case TdsColumnType
.Decimal
:
483 case TdsColumnType
.Numeric
:
484 dataTypeNames
.Add ("decimal");
485 row
["ProviderType"] = (int) SybaseType
.Decimal
;
486 row
["DataType"] = typeof (decimal);
487 row
["IsLong"] = false;
489 case TdsColumnType
.NChar
:
490 dataTypeNames
.Add ("nchar");
491 row
["ProviderType"] = (int) SybaseType
.NChar
;
492 row
["DataType"] = typeof (string);
493 row
["IsLong"] = false;
495 case TdsColumnType
.SmallMoney
:
496 dataTypeNames
.Add ("smallmoney");
497 row
["ProviderType"] = (int) SybaseType
.SmallMoney
;
498 row
["DataType"] = typeof (decimal);
499 row
["IsLong"] = false;
502 dataTypeNames
.Add ("variant");
503 row
["ProviderType"] = (int) SybaseType
.Variant
;
504 row
["DataType"] = typeof (object);
505 row
["IsLong"] = false;
509 schemaTable
.Rows
.Add (row
);
516 private static object GetSchemaValue (TdsDataColumn schema
, object key
)
518 if (schema
.ContainsKey (key
) && schema
[key
] != null)
523 public SybaseBinary
GetSybaseBinary (int i
)
525 throw new NotImplementedException ();
528 public SybaseBoolean
GetSybaseBoolean (int i
)
530 object value = GetSybaseValue (i
);
531 if (!(value is SybaseBoolean
))
532 throw new InvalidCastException ();
533 return (SybaseBoolean
) value;
536 public SybaseByte
GetSybaseByte (int i
)
538 object value = GetSybaseValue (i
);
539 if (!(value is SybaseByte
))
540 throw new InvalidCastException ();
541 return (SybaseByte
) value;
544 public SybaseDateTime
GetSybaseDateTime (int i
)
546 object value = GetSybaseValue (i
);
547 if (!(value is SybaseDateTime
))
548 throw new InvalidCastException ();
549 return (SybaseDateTime
) value;
552 public SybaseDecimal
GetSybaseDecimal (int i
)
554 object value = GetSybaseValue (i
);
555 if (!(value is SybaseDecimal
))
556 throw new InvalidCastException ();
557 return (SybaseDecimal
) value;
560 public SybaseDouble
GetSybaseDouble (int i
)
562 object value = GetSybaseValue (i
);
563 if (!(value is SybaseDouble
))
564 throw new InvalidCastException ();
565 return (SybaseDouble
) value;
568 public SybaseGuid
GetSybaseGuid (int i
)
570 object value = GetSybaseValue (i
);
571 if (!(value is SybaseGuid
))
572 throw new InvalidCastException ();
573 return (SybaseGuid
) value;
576 public SybaseInt16
GetSybaseInt16 (int i
)
578 object value = GetSybaseValue (i
);
579 if (!(value is SybaseInt16
))
580 throw new InvalidCastException ();
581 return (SybaseInt16
) value;
584 public SybaseInt32
GetSybaseInt32 (int i
)
586 object value = GetSybaseValue (i
);
587 if (!(value is SybaseInt32
))
588 throw new InvalidCastException ();
589 return (SybaseInt32
) value;
592 public SybaseInt64
GetSybaseInt64 (int i
)
594 object value = GetSybaseValue (i
);
595 if (!(value is SybaseInt64
))
596 throw new InvalidCastException ();
597 return (SybaseInt64
) value;
600 public SybaseMoney
GetSybaseMoney (int i
)
602 object value = GetSybaseValue (i
);
603 if (!(value is SybaseMoney
))
604 throw new InvalidCastException ();
605 return (SybaseMoney
) value;
608 public SybaseSingle
GetSybaseSingle (int i
)
610 object value = GetSybaseValue (i
);
611 if (!(value is SybaseSingle
))
612 throw new InvalidCastException ();
613 return (SybaseSingle
) value;
616 public SybaseString
GetSybaseString (int i
)
618 object value = GetSybaseValue (i
);
619 if (!(value is SybaseString
))
620 throw new InvalidCastException ();
621 return (SybaseString
) value;
624 [MonoTODO ("Implement TdsBigDecimal conversion. SybaseType.Real fails tests?")]
625 public object GetSybaseValue (int i
)
627 SybaseType type
= (SybaseType
) (schemaTable
.Rows
[i
]["ProviderType"]);
628 object value = GetValue (i
);
631 case SybaseType
.BigInt
:
632 if (value == DBNull
.Value
)
633 return SybaseInt64
.Null
;
634 return (SybaseInt64
) ((long) value);
635 case SybaseType
.Binary
:
636 case SybaseType
.Image
:
637 case SybaseType
.VarBinary
:
638 case SybaseType
.Timestamp
:
639 if (value == DBNull
.Value
)
640 return SybaseBinary
.Null
;
641 return (SybaseBinary
) ((byte[]) value);
643 if (value == DBNull
.Value
)
644 return SybaseBoolean
.Null
;
645 return (SybaseBoolean
) ((bool) value);
646 case SybaseType
.Char
:
647 case SybaseType
.NChar
:
648 case SybaseType
.NText
:
649 case SybaseType
.NVarChar
:
650 case SybaseType
.Text
:
651 case SybaseType
.VarChar
:
652 if (value == DBNull
.Value
)
653 return SybaseString
.Null
;
654 return (SybaseString
) ((string) value);
655 case SybaseType
.DateTime
:
656 case SybaseType
.SmallDateTime
:
657 if (value == DBNull
.Value
)
658 return SybaseDateTime
.Null
;
659 return (SybaseDateTime
) ((DateTime
) value);
660 case SybaseType
.Decimal
:
661 if (value == DBNull
.Value
)
662 return SybaseDecimal
.Null
;
663 if (value is TdsBigDecimal
)
664 return SybaseDecimal
.FromTdsBigDecimal ((TdsBigDecimal
) value);
665 return (SybaseDecimal
) ((decimal) value);
666 case SybaseType
.Float
:
667 if (value == DBNull
.Value
)
668 return SybaseDouble
.Null
;
669 return (SybaseDouble
) ((double) value);
671 if (value == DBNull
.Value
)
672 return SybaseInt32
.Null
;
673 return (SybaseInt32
) ((int) value);
674 case SybaseType
.Money
:
675 case SybaseType
.SmallMoney
:
676 if (value == DBNull
.Value
)
677 return SybaseMoney
.Null
;
678 return (SybaseMoney
) ((decimal) value);
679 case SybaseType
.Real
:
680 if (value == DBNull
.Value
)
681 return SybaseSingle
.Null
;
682 return (SybaseSingle
) ((float) value);
683 case SybaseType
.UniqueIdentifier
:
684 if (value == DBNull
.Value
)
685 return SybaseGuid
.Null
;
686 return (SybaseGuid
) ((Guid
) value);
687 case SybaseType
.SmallInt
:
688 if (value == DBNull
.Value
)
689 return SybaseInt16
.Null
;
690 return (SybaseInt16
) ((short) value);
691 case SybaseType
.TinyInt
:
692 if (value == DBNull
.Value
)
693 return SybaseByte
.Null
;
694 return (SybaseByte
) ((byte) value);
697 throw new InvalidOperationException ("The type of this column is unknown.");
700 public int GetSybaseValues (object[] values
)
703 int columnCount
= schemaTable
.Rows
.Count
;
704 int arrayCount
= values
.Length
;
706 if (arrayCount
> columnCount
)
711 for (int i
= 0; i
< count
; i
+= 1)
712 values
[i
] = GetSybaseValue (i
);
717 public string GetString (int i
)
719 object value = GetValue (i
);
720 if (!(value is string)) {
721 if (value is DBNull
) throw new SybaseNullValueException ();
722 throw new InvalidCastException ();
724 return (string) value;
727 public object GetValue (int i
)
729 return command
.Tds
.ColumnValues
[i
];
732 public int GetValues (object[] values
)
734 int len
= values
.Length
;
735 int bigDecimalIndex
= command
.Tds
.ColumnValues
.BigDecimalIndex
;
737 // If a four-byte decimal is stored, then we can't convert to
738 // a native type. Throw an OverflowException.
739 if (bigDecimalIndex
>= 0 && bigDecimalIndex
< len
)
740 throw new OverflowException ();
742 command
.Tds
.ColumnValues
.CopyTo (0, values
, 0, len
);
743 return (len
> FieldCount
? len
: FieldCount
);
746 void IDisposable
.Dispose ()
749 GC
.SuppressFinalize (this);
752 IEnumerator IEnumerable
.GetEnumerator ()
754 return new DbEnumerator (this);
757 public bool IsDBNull (int i
)
759 return GetValue (i
) == DBNull
.Value
;
762 public bool NextResult ()
764 if ((command
.CommandBehavior
& CommandBehavior
.SingleResult
) != 0 && resultsRead
> 0)
766 if (command
.Tds
.DoneProc
)
769 schemaTable
.Rows
.Clear ();
771 moreResults
= command
.Tds
.NextResult ();
781 if ((command
.CommandBehavior
& CommandBehavior
.SingleRow
) != 0 && rowsRead
> 0)
783 if ((command
.CommandBehavior
& CommandBehavior
.SchemaOnly
) != 0)
788 bool result
= command
.Tds
.NextRow ();
795 #endregion // Methods