Поделиться через


DataTableReader.GetEnumerator Метод

Определение

Возвращает перечислитель, который может использоваться для перемещения по коллекции элементов.

public:
 override System::Collections::IEnumerator ^ GetEnumerator();
public override System.Collections.IEnumerator GetEnumerator ();
override this.GetEnumerator : unit -> System.Collections.IEnumerator
Public Overrides Function GetEnumerator () As IEnumerator

Возвращаемое значение

Объект IEnumerator, представляющий коллекцию элементов.

Исключения

Предпринята попытка чтения или доступа к столбцу закрытого объекта DataTableReader.

Примеры

В следующем примере иллюстрируется использование метода GetEnumerator. Сюда входит поведение перечислителя при удалении строк из базового DataTable элемента, когда перечислитель активен.

public static void Main()
{
    try
    {
        DataTable userTable = new DataTable("peopleTable");

        userTable.Columns.Add("Id", typeof(int));
        userTable.Columns.Add("Name", typeof(string));

        // Note that even if you create the DataTableReader
        // before adding the rows, the enumerator can still
        // visit all the rows.
        DataTableReader reader = userTable.CreateDataReader();
        userTable.Rows.Add(new object[] { 1, "Peter" });
        userTable.Rows.Add(new object[] { 2, "Mary" });
        userTable.Rows.Add(new object[] { 3, "Andy" });
        userTable.Rows.Add(new object[] { 4, "Russ" });

        IEnumerator enumerator = reader.GetEnumerator();
        // Keep track of whether the row to be deleted
        // has actually been deleted yet. This allows
        // this sample to demonstrate that the enumerator
        // is able to survive row deletion.
        bool isRowDeleted = false;
        while (enumerator.MoveNext())
        {
            DbDataRecord dataRecord = (DbDataRecord)enumerator.Current;

            // While the enumerator is active, delete a row.
            // This doesn't affect the behavior of the enumerator.
            if (!isRowDeleted)
            {
                isRowDeleted = true;
                userTable.Rows[2].Delete();
            }
            Console.WriteLine(dataRecord.GetString(1));
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
    Console.ReadLine();
}
Sub Main()
   Try
      Dim userTable As New DataTable("peopleTable")
      userTable.Columns.Add("Id", GetType(Integer))
      userTable.Columns.Add("Name", GetType(String))

      ' Note that even if you create the DataTableReader
      ' before adding the rows, the enumerator can still
      ' visit all the rows.
      Dim reader As DataTableReader = userTable.CreateDataReader()
      userTable.Rows.Add(1, "Peter")
      userTable.Rows.Add(2, "Mary")
      userTable.Rows.Add(3, "Andy")
      userTable.Rows.Add(4, "Russ")

      Dim enumerator As IEnumerator = reader.GetEnumerator()
      ' Keep track of whether the row to be deleted
      ' has actually been deleted yet. This allows
      ' this sample to demonstrate that the enumerator
      ' is able to survive row deletion.
      Dim isRowDeleted As Boolean = False
      While (enumerator.MoveNext())

         Dim dataRecord As DbDataRecord = CType(enumerator.Current, _
             DbDataRecord)

         ' While the enumerator is active, delete a row.
         ' This doesn't affect the behavior of the enumerator.
         If Not isRowDeleted Then
            isRowDeleted = True
            userTable.Rows(2).Delete()
         End If
         Console.WriteLine(dataRecord.GetString(1))
      End While
   Catch ex As Exception

      Console.WriteLine(ex)
   End Try
   Console.ReadLine()
End Sub

Процедура отображает следующий текст в окне Консоли:

Peter  
Mary  
Russ  

Комментарии

Перечислители позволяют только считывать данные в DataTableReader. Перечислители нельзя использовать для изменения базовой коллекции.

Сначала перечислитель размещается перед первым элементом в коллекции. В этой позиции вызов Current вызывает исключение. Поэтому необходимо вызвать метод MoveNext, чтобы переместить перечислитель к первому элементу коллекции до считывания значения свойства Current.

Current возвращает объект DbDataRecordи возвращает тот же объект до тех пор, пока не MoveNext будет вызвана или Reset . MoveNext задает Current в качестве значения для следующего элемента.

После того как будет передан конец коллекции, перечислитель позиционируется после последнего элемента в коллекции, а вызов MoveNext возвращает значение false. Если последний вызов MoveNext возвращал false, вызов Current вызывает исключение. Кроме того, так как DataTableReader предоставляет только прямого доступа к своим данным, вызов Reset метода IEnumerator вызывает исключение NotSupportedException.

предоставляет DataTableReader стабильный перечислитель. Это означает, что даже при удалении или добавлении строк в базовых данных перечислитель, возвращаемый вызовом , по-прежнему GetEnumerator действителен.

Применяется к