dbenumerator.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. //------------------------------------------------------------------------------
  2. // <copyright file="dbenumerator.cs" company="Microsoft">
  3. // Copyright (c) Microsoft Corporation. All rights reserved.
  4. // </copyright>
  5. // <owner current="true" primary="true">Microsoft</owner>
  6. // <owner current="true" primary="false">Microsoft</owner>
  7. //------------------------------------------------------------------------------
  8. namespace System.Data.Common {
  9. using System;
  10. using System.Collections;
  11. using System.Data;
  12. using System.Data.ProviderBase;
  13. using System.Diagnostics;
  14. using System.ComponentModel;
  15. public class DbEnumerator : IEnumerator {
  16. internal IDataReader _reader;
  17. internal DbDataRecord _current;
  18. internal SchemaInfo[] _schemaInfo; // shared schema info among all the data records
  19. internal PropertyDescriptorCollection _descriptors; // cached property descriptors
  20. private FieldNameLookup _fieldNameLookup; // MDAC 69015
  21. private bool closeReader;
  22. // users must get enumerators off of the datareader interfaces
  23. public DbEnumerator(IDataReader reader) {
  24. if (null == reader) {
  25. throw ADP.ArgumentNull("reader");
  26. }
  27. _reader = reader;
  28. }
  29. public DbEnumerator(IDataReader reader, bool closeReader) { // MDAC 68670
  30. if (null == reader) {
  31. throw ADP.ArgumentNull("reader");
  32. }
  33. _reader = reader;
  34. this.closeReader = closeReader;
  35. }
  36. public DbEnumerator(DbDataReader reader)
  37. : this((IDataReader)reader) {
  38. }
  39. public DbEnumerator(DbDataReader reader, bool closeReader)
  40. : this((IDataReader)reader, closeReader) {
  41. }
  42. public object Current {
  43. get {
  44. return _current;
  45. }
  46. }
  47. public bool MoveNext() {
  48. if (null == _schemaInfo) {
  49. BuildSchemaInfo();
  50. }
  51. Debug.Assert(null != _schemaInfo && null != _descriptors, "unable to build schema information!");
  52. _current = null;
  53. if (_reader.Read()) {
  54. // setup our current record
  55. object[] values = new object[_schemaInfo.Length];
  56. _reader.GetValues(values); // this.GetValues()
  57. _current = new DataRecordInternal(_schemaInfo, values, _descriptors, _fieldNameLookup); // this.NewRecord()
  58. return true;
  59. }
  60. if (closeReader) {
  61. _reader.Close();
  62. }
  63. return false;
  64. }
  65. [ EditorBrowsableAttribute(EditorBrowsableState.Never) ] // MDAC 69508
  66. public void Reset() {
  67. throw ADP.NotSupported();
  68. }
  69. private void BuildSchemaInfo() {
  70. int count = _reader.FieldCount;
  71. string[] fieldnames = new string[count];
  72. for (int i = 0; i < count; ++i) {
  73. fieldnames[i] = _reader.GetName(i);
  74. }
  75. ADP.BuildSchemaTableInfoTableNames(fieldnames); // MDAC 71401
  76. SchemaInfo[] si = new SchemaInfo[count];
  77. PropertyDescriptor[] props = new PropertyDescriptor[_reader.FieldCount];
  78. for (int i = 0; i < si.Length; i++) {
  79. SchemaInfo s = new SchemaInfo();
  80. s.name = _reader.GetName(i);
  81. s.type = _reader.GetFieldType(i);
  82. s.typeName = _reader.GetDataTypeName(i);
  83. props[i] = new DbColumnDescriptor(i, fieldnames[i], s.type);
  84. si[i] = s;
  85. }
  86. _schemaInfo = si;
  87. _fieldNameLookup = new FieldNameLookup(_reader, -1); // MDAC 71470
  88. _descriptors = new PropertyDescriptorCollection(props);
  89. }
  90. sealed private class DbColumnDescriptor : PropertyDescriptor {
  91. int _ordinal;
  92. Type _type;
  93. internal DbColumnDescriptor(int ordinal, string name, Type type)
  94. : base(name, null) {
  95. _ordinal = ordinal;
  96. _type = type;
  97. }
  98. public override Type ComponentType {
  99. get {
  100. return typeof(IDataRecord);
  101. }
  102. }
  103. public override bool IsReadOnly {
  104. get {
  105. return true;
  106. }
  107. }
  108. public override Type PropertyType {
  109. get {
  110. return _type;
  111. }
  112. }
  113. public override bool CanResetValue(object component) {
  114. return false;
  115. }
  116. public override object GetValue(object component) {
  117. return ((IDataRecord)component)[_ordinal];
  118. }
  119. public override void ResetValue(object component) {
  120. throw ADP.NotSupported();
  121. }
  122. public override void SetValue(object component, object value) {
  123. throw ADP.NotSupported();
  124. }
  125. public override bool ShouldSerializeValue(object component) {
  126. return false;
  127. }
  128. }
  129. }
  130. }