* list :
authorTim Coleman <tim@mono-cvs.ximian.com>
Thu, 31 Oct 2002 07:31:32 +0000 (07:31 -0000)
committerTim Coleman <tim@mono-cvs.ximian.com>
Thu, 31 Oct 2002 07:31:32 +0000 (07:31 -0000)
Add System.Data.Common/DbEnumerator.cs
* System.Data.SqlClient/SqlDataReader.cs:
Remove SqlDataReaderEnumerator -- use DbEnumerator instead
* System.Data.Common/DbEnumerator.cs:
New class added

svn path=/trunk/mcs/; revision=8709

mcs/class/System.Data/System.Data.Common/DbEnumerator.cs [new file with mode: 0644]
mcs/class/System.Data/System.Data.SqlClient/SqlDataReader.cs
mcs/class/System.Data/list

diff --git a/mcs/class/System.Data/System.Data.Common/DbEnumerator.cs b/mcs/class/System.Data/System.Data.Common/DbEnumerator.cs
new file mode 100644 (file)
index 0000000..411860a
--- /dev/null
@@ -0,0 +1,103 @@
+//
+// System.Data.SqlClient.DbEnumerator.cs
+//
+// Author:
+//   Tim Coleman (tim@timcoleman.com)
+//
+// Copyright (C) Tim Coleman, 2002
+//
+
+using System;
+using System.Collections;
+using System.Data;
+
+namespace System.Data.Common {
+       public class DbEnumerator : IEnumerator
+       {
+               #region Fields
+
+               IDataReader reader;
+               bool closeReader;
+               SchemaInfo[] schema;
+               FieldNameLookup lookup;
+               int fieldCount;
+       
+               #endregion // Fields
+
+               #region Constructors
+
+               public DbEnumerator (IDataReader reader) 
+                       : this (reader, false)
+               {
+               }
+
+               public DbEnumerator (IDataReader reader, bool closeReader)
+               {
+                       this.reader = reader;
+                       this.closeReader = closeReader;
+                       this.lookup = new FieldNameLookup ();
+                       this.fieldCount = 0;
+                       LoadSchema (reader.GetSchemaTable ());
+               }
+
+               #endregion // Constructors
+
+               #region Properties
+
+               public virtual object Current {
+                       get { 
+                               object[] values = new object[fieldCount];
+                               reader.GetValues (values);
+                               return new DbDataRecord (schema, values, lookup); 
+                       }
+               }
+
+               #endregion // Properties
+
+               #region Methods
+
+               public void LoadSchema (DataTable schemaTable)
+               {
+                       ArrayList list = new ArrayList ();
+                       foreach (DataRow row in schemaTable.Rows) {
+                               SchemaInfo columnSchema = new SchemaInfo ();
+                               lookup.Add ((string) row["ColumnName"]);
+
+                               columnSchema.ColumnName = (string) row ["ColumnName"];
+                               columnSchema.ColumnOrdinal = (int) row ["ColumnOrdinal"];
+                               columnSchema.TableName = (string) row ["BaseTableName"];
+                               columnSchema.Nullable = (bool) row ["AllowDBNull"];
+                               columnSchema.Writable = ! (bool) row ["IsReadOnly"];
+
+                               if (row["NumericPrecision"] != DBNull.Value)
+                                       columnSchema.NumericPrecision = (byte) row["NumericPrecision"];
+                               else
+                                       columnSchema.NumericPrecision = (byte) 0;
+
+                               if (row["NumericScale"] != DBNull.Value)
+                                       columnSchema.NumericScale = (byte) row["NumericScale"];
+                               else
+                                       columnSchema.NumericScale = (byte) 0;
+                               list.Add (columnSchema);
+                               fieldCount += 1;
+                       }
+                       schema = (SchemaInfo[]) list.ToArray (typeof (SchemaInfo));
+               }
+
+               public virtual bool MoveNext ()
+               {
+                       if (reader.Read ()) 
+                               return true;
+                       if (closeReader)
+                               reader.Close ();
+                       return false;
+               }
+
+               public virtual void Reset ()
+               {
+                       throw new InvalidOperationException ("This enumerator can only go forward.");   
+               }
+               
+               #endregion // Methods
+       }
+}
index 02fca77976089e2e683a49356ae2e717120c1bc1..8880d6885d6ee54529f5f0f426d00fce029a409e 100644 (file)
@@ -326,7 +326,7 @@ namespace System.Data.SqlClient {
 
                IEnumerator IEnumerable.GetEnumerator ()
                {
-                       return new SqlDataReaderEnumerator (this);
+                       return new DbEnumerator (this);
                }
 
                public bool IsDBNull (int i)
@@ -371,60 +371,5 @@ namespace System.Data.SqlClient {
                }
 
                #endregion // Methods
-
-               private class SqlDataReaderEnumerator : IEnumerator, ICloneable 
-               {
-
-                       #region Fields
-
-                       SqlDataReader reader;
-                       
-                       #endregion // Fields
-
-                       #region Constructors
-
-                       public SqlDataReaderEnumerator (SqlDataReader reader)
-                       {
-                               this.reader = reader;
-                       }
-
-                       #endregion // Constructors
-       
-                       #region Properties
-
-                       public virtual object Current {
-                               get { 
-                                       SchemaInfo[] schema = reader.Schema;
-                                       object[] values = new object[schema.Length];
-                                       reader.GetValues (values);
-                                       return new DbDataRecord (schema, values, reader.Lookup); 
-                               }
-                       }
-
-                       #endregion // Properties
-
-                       #region Methods
-
-                       object ICloneable.Clone ()
-                       {
-                               return new SqlDataReaderEnumerator (reader);
-                       }
-                       
-                       public virtual bool MoveNext ()
-                       {
-                               if (reader.Read ()) 
-                                       return true;
-                               if (reader.NextResult () && reader.Read ())
-                                       return true;
-                               return false;
-                       }
-
-                       public virtual void Reset ()
-                       {
-                               throw new InvalidOperationException ("This enumerator can only go forward.");   
-                       }
-                       
-                       #endregion // Methods
-               }
        }
 }
index c2b28f8de4484c763520344a3634e453c29a45af..260d87b6624412e3de46a02330c02d229e3a70d2 100755 (executable)
@@ -94,6 +94,7 @@ System.Data.Common/DbDataAdapter.cs
 System.Data.Common/DbDataPermission.cs
 System.Data.Common/DbDataPermissionAttribute.cs
 System.Data.Common/DbDataRecord.cs
+System.Data.Common/DbEnumerator.cs
 System.Data.Common/FieldNameLookup.cs
 System.Data.Common/RowUpdatedEventArgs.cs
 System.Data.Common/RowUpdatingEventArgs.cs