536cd135cc
Former-commit-id: 5624ac747d633e885131e8349322922b6a59baaa
158 lines
5.1 KiB
C#
158 lines
5.1 KiB
C#
//------------------------------------------------------------------------------
|
|
// <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;
|
|
}
|
|
}
|
|
}
|
|
}
|