DataReaderContainer.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. //------------------------------------------------------------------------------
  2. // <copyright file="DataReaderContainer.cs" company="Microsoft">
  3. // Copyright (c) Microsoft Corporation. All rights reserved.
  4. // </copyright>
  5. // <owner current="true" primary="true">[....]</owner>
  6. //------------------------------------------------------------------------------
  7. namespace System.Data.ProviderBase {
  8. using System;
  9. using System.Data;
  10. using System.Data.Common;
  11. using System.Diagnostics;
  12. internal abstract class DataReaderContainer {
  13. protected readonly IDataReader _dataReader;
  14. protected int _fieldCount;
  15. static internal DataReaderContainer Create(IDataReader dataReader, bool returnProviderSpecificTypes) {
  16. if (returnProviderSpecificTypes) {
  17. DbDataReader providerSpecificDataReader = (dataReader as DbDataReader);
  18. if (null != providerSpecificDataReader) {
  19. return new ProviderSpecificDataReader(dataReader, providerSpecificDataReader);
  20. }
  21. }
  22. return new CommonLanguageSubsetDataReader(dataReader);
  23. }
  24. protected DataReaderContainer(IDataReader dataReader) {
  25. Debug.Assert(null != dataReader, "null dataReader");
  26. _dataReader = dataReader;
  27. }
  28. internal int FieldCount {
  29. get {
  30. return _fieldCount;
  31. }
  32. }
  33. internal abstract bool ReturnProviderSpecificTypes { get; }
  34. protected abstract int VisibleFieldCount { get; }
  35. internal abstract Type GetFieldType(int ordinal);
  36. internal abstract object GetValue(int ordinal);
  37. internal abstract int GetValues(object[] values);
  38. internal string GetName(int ordinal) {
  39. string fieldName = _dataReader.GetName(ordinal);
  40. Debug.Assert(null != fieldName, "null GetName");
  41. return ((null != fieldName) ? fieldName : "");
  42. }
  43. internal DataTable GetSchemaTable() {
  44. return _dataReader.GetSchemaTable();
  45. }
  46. internal bool NextResult() {
  47. _fieldCount = 0;
  48. if (_dataReader.NextResult()) {
  49. _fieldCount = VisibleFieldCount;
  50. return true;
  51. }
  52. return false;
  53. }
  54. internal bool Read() {
  55. return _dataReader.Read();
  56. }
  57. private sealed class ProviderSpecificDataReader : DataReaderContainer {
  58. private DbDataReader _providerSpecificDataReader;
  59. internal ProviderSpecificDataReader(IDataReader dataReader, DbDataReader dbDataReader) : base(dataReader) {
  60. Debug.Assert(null != dataReader, "null dbDataReader");
  61. _providerSpecificDataReader = dbDataReader;
  62. _fieldCount = VisibleFieldCount;
  63. }
  64. internal override bool ReturnProviderSpecificTypes {
  65. get {
  66. return true;
  67. }
  68. }
  69. protected override int VisibleFieldCount {
  70. get {
  71. int fieldCount = _providerSpecificDataReader.VisibleFieldCount;
  72. Debug.Assert(0 <= fieldCount, "negative FieldCount");
  73. return ((0 <= fieldCount) ? fieldCount : 0);
  74. }
  75. }
  76. internal override Type GetFieldType(int ordinal) {
  77. Type fieldType = _providerSpecificDataReader.GetProviderSpecificFieldType(ordinal);
  78. Debug.Assert(null != fieldType, "null FieldType");
  79. return fieldType;
  80. }
  81. internal override object GetValue(int ordinal) {
  82. return _providerSpecificDataReader.GetProviderSpecificValue(ordinal);
  83. }
  84. internal override int GetValues(object[] values) {
  85. return _providerSpecificDataReader.GetProviderSpecificValues(values);
  86. }
  87. }
  88. private sealed class CommonLanguageSubsetDataReader : DataReaderContainer {
  89. internal CommonLanguageSubsetDataReader(IDataReader dataReader ) : base(dataReader) {
  90. _fieldCount = VisibleFieldCount;
  91. }
  92. internal override bool ReturnProviderSpecificTypes {
  93. get {
  94. return false;
  95. }
  96. }
  97. protected override int VisibleFieldCount {
  98. get {
  99. int fieldCount = _dataReader.FieldCount;
  100. Debug.Assert(0 <= fieldCount, "negative FieldCount");
  101. return ((0 <= fieldCount) ? fieldCount : 0);
  102. }
  103. }
  104. internal override Type GetFieldType(int ordinal) {
  105. return _dataReader.GetFieldType(ordinal);
  106. }
  107. internal override object GetValue(int ordinal) {
  108. return _dataReader.GetValue(ordinal);
  109. }
  110. internal override int GetValues(object[] values) {
  111. return _dataReader.GetValues(values);
  112. }
  113. }
  114. }
  115. }