2016-08-03 10:59:49 +00:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// <copyright file="DataReaderContainer.cs" company="Microsoft">
|
|
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
// </copyright>
|
2017-08-21 15:34:15 +00:00
|
|
|
// <owner current="true" primary="true">Microsoft</owner>
|
2016-08-03 10:59:49 +00:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
namespace System.Data.ProviderBase {
|
|
|
|
|
|
|
|
using System;
|
|
|
|
using System.Data;
|
|
|
|
using System.Data.Common;
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
|
|
|
internal abstract class DataReaderContainer {
|
|
|
|
|
|
|
|
protected readonly IDataReader _dataReader;
|
|
|
|
protected int _fieldCount;
|
|
|
|
|
|
|
|
static internal DataReaderContainer Create(IDataReader dataReader, bool returnProviderSpecificTypes) {
|
|
|
|
if (returnProviderSpecificTypes) {
|
|
|
|
DbDataReader providerSpecificDataReader = (dataReader as DbDataReader);
|
|
|
|
if (null != providerSpecificDataReader) {
|
|
|
|
return new ProviderSpecificDataReader(dataReader, providerSpecificDataReader);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return new CommonLanguageSubsetDataReader(dataReader);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected DataReaderContainer(IDataReader dataReader) {
|
|
|
|
Debug.Assert(null != dataReader, "null dataReader");
|
|
|
|
_dataReader = dataReader;
|
|
|
|
}
|
|
|
|
|
|
|
|
internal int FieldCount {
|
|
|
|
get {
|
|
|
|
return _fieldCount;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
internal abstract bool ReturnProviderSpecificTypes { get; }
|
|
|
|
protected abstract int VisibleFieldCount { get; }
|
|
|
|
|
|
|
|
internal abstract Type GetFieldType(int ordinal);
|
|
|
|
internal abstract object GetValue(int ordinal);
|
|
|
|
internal abstract int GetValues(object[] values);
|
|
|
|
|
|
|
|
internal string GetName(int ordinal) {
|
|
|
|
string fieldName = _dataReader.GetName(ordinal);
|
|
|
|
Debug.Assert(null != fieldName, "null GetName");
|
|
|
|
return ((null != fieldName) ? fieldName : "");
|
|
|
|
}
|
|
|
|
internal DataTable GetSchemaTable() {
|
|
|
|
return _dataReader.GetSchemaTable();
|
|
|
|
}
|
|
|
|
internal bool NextResult() {
|
|
|
|
_fieldCount = 0;
|
|
|
|
if (_dataReader.NextResult()) {
|
|
|
|
_fieldCount = VisibleFieldCount;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
internal bool Read() {
|
|
|
|
return _dataReader.Read();
|
|
|
|
}
|
|
|
|
|
|
|
|
private sealed class ProviderSpecificDataReader : DataReaderContainer {
|
|
|
|
private DbDataReader _providerSpecificDataReader;
|
|
|
|
|
|
|
|
internal ProviderSpecificDataReader(IDataReader dataReader, DbDataReader dbDataReader) : base(dataReader) {
|
|
|
|
Debug.Assert(null != dataReader, "null dbDataReader");
|
|
|
|
_providerSpecificDataReader = dbDataReader;
|
|
|
|
_fieldCount = VisibleFieldCount;
|
|
|
|
}
|
|
|
|
|
|
|
|
internal override bool ReturnProviderSpecificTypes {
|
|
|
|
get {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
protected override int VisibleFieldCount {
|
|
|
|
get {
|
|
|
|
int fieldCount = _providerSpecificDataReader.VisibleFieldCount;
|
|
|
|
Debug.Assert(0 <= fieldCount, "negative FieldCount");
|
|
|
|
return ((0 <= fieldCount) ? fieldCount : 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
internal override Type GetFieldType(int ordinal) {
|
|
|
|
Type fieldType = _providerSpecificDataReader.GetProviderSpecificFieldType(ordinal);
|
|
|
|
Debug.Assert(null != fieldType, "null FieldType");
|
|
|
|
return fieldType;
|
|
|
|
}
|
|
|
|
internal override object GetValue(int ordinal) {
|
|
|
|
return _providerSpecificDataReader.GetProviderSpecificValue(ordinal);
|
|
|
|
}
|
|
|
|
internal override int GetValues(object[] values) {
|
|
|
|
return _providerSpecificDataReader.GetProviderSpecificValues(values);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private sealed class CommonLanguageSubsetDataReader : DataReaderContainer {
|
|
|
|
|
|
|
|
internal CommonLanguageSubsetDataReader(IDataReader dataReader ) : base(dataReader) {
|
|
|
|
_fieldCount = VisibleFieldCount;
|
|
|
|
}
|
|
|
|
|
|
|
|
internal override bool ReturnProviderSpecificTypes {
|
|
|
|
get {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
protected override int VisibleFieldCount {
|
|
|
|
get {
|
|
|
|
int fieldCount = _dataReader.FieldCount;
|
|
|
|
Debug.Assert(0 <= fieldCount, "negative FieldCount");
|
|
|
|
return ((0 <= fieldCount) ? fieldCount : 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
internal override Type GetFieldType(int ordinal) {
|
|
|
|
return _dataReader.GetFieldType(ordinal);
|
|
|
|
}
|
|
|
|
internal override object GetValue(int ordinal) {
|
|
|
|
return _dataReader.GetValue(ordinal);
|
|
|
|
}
|
|
|
|
internal override int GetValues(object[] values) {
|
|
|
|
return _dataReader.GetValues(values);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|