| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- //------------------------------------------------------------------------------
- // <copyright file="dbenumerator.cs" company="Microsoft">
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // </copyright>
- // <owner current="true" primary="true">Microsoft</owner>
- // <owner current="true" primary="false">Microsoft</owner>
- //------------------------------------------------------------------------------
- namespace System.Data.Common {
- using System;
- using System.Collections;
- using System.Data;
- using System.Data.ProviderBase;
- using System.Diagnostics;
- using System.ComponentModel;
- public class DbEnumerator : IEnumerator {
- internal IDataReader _reader;
- internal DbDataRecord _current;
- internal SchemaInfo[] _schemaInfo; // shared schema info among all the data records
- internal PropertyDescriptorCollection _descriptors; // cached property descriptors
- private FieldNameLookup _fieldNameLookup; // MDAC 69015
- private bool closeReader;
- // users must get enumerators off of the datareader interfaces
- public DbEnumerator(IDataReader reader) {
- if (null == reader) {
- throw ADP.ArgumentNull("reader");
- }
- _reader = reader;
- }
- public DbEnumerator(IDataReader reader, bool closeReader) { // MDAC 68670
- if (null == reader) {
- throw ADP.ArgumentNull("reader");
- }
- _reader = reader;
- this.closeReader = closeReader;
- }
-
- public DbEnumerator(DbDataReader reader)
- : this((IDataReader)reader) {
- }
- public DbEnumerator(DbDataReader reader, bool closeReader)
- : this((IDataReader)reader, closeReader) {
- }
- public object Current {
- get {
- return _current;
- }
- }
-
- public bool MoveNext() {
- if (null == _schemaInfo) {
- BuildSchemaInfo();
- }
- Debug.Assert(null != _schemaInfo && null != _descriptors, "unable to build schema information!");
- _current = null;
- if (_reader.Read()) {
- // setup our current record
- object[] values = new object[_schemaInfo.Length];
- _reader.GetValues(values); // this.GetValues()
- _current = new DataRecordInternal(_schemaInfo, values, _descriptors, _fieldNameLookup); // this.NewRecord()
- return true;
- }
- if (closeReader) {
- _reader.Close();
- }
- return false;
- }
- [ EditorBrowsableAttribute(EditorBrowsableState.Never) ] // MDAC 69508
- public void Reset() {
- throw ADP.NotSupported();
- }
- private void BuildSchemaInfo() {
- int count = _reader.FieldCount;
- string[] fieldnames = new string[count];
- for (int i = 0; i < count; ++i) {
- fieldnames[i] = _reader.GetName(i);
- }
- ADP.BuildSchemaTableInfoTableNames(fieldnames); // MDAC 71401
- SchemaInfo[] si = new SchemaInfo[count];
- PropertyDescriptor[] props = new PropertyDescriptor[_reader.FieldCount];
- for (int i = 0; i < si.Length; i++) {
- SchemaInfo s = new SchemaInfo();
- s.name = _reader.GetName(i);
- s.type = _reader.GetFieldType(i);
- s.typeName = _reader.GetDataTypeName(i);
- props[i] = new DbColumnDescriptor(i, fieldnames[i], s.type);
- si[i] = s;
- }
- _schemaInfo = si;
- _fieldNameLookup = new FieldNameLookup(_reader, -1); // MDAC 71470
- _descriptors = new PropertyDescriptorCollection(props);
- }
- sealed private class DbColumnDescriptor : PropertyDescriptor {
- int _ordinal;
- Type _type;
- internal DbColumnDescriptor(int ordinal, string name, Type type)
- : base(name, null) {
- _ordinal = ordinal;
- _type = type;
- }
- public override Type ComponentType {
- get {
- return typeof(IDataRecord);
- }
- }
- public override bool IsReadOnly {
- get {
- return true;
- }
- }
- public override Type PropertyType {
- get {
- return _type;
- }
- }
- public override bool CanResetValue(object component) {
- return false;
- }
- public override object GetValue(object component) {
- return ((IDataRecord)component)[_ordinal];
- }
- public override void ResetValue(object component) {
- throw ADP.NotSupported();
- }
- public override void SetValue(object component, object value) {
- throw ADP.NotSupported();
- }
- public override bool ShouldSerializeValue(object component) {
- return false;
- }
- }
- }
- }
|