DataTableReader.GetEnumerator Methode

Definition

Gibt einen Enumerator zurück, der zum Durchlaufen der Elementauflistung verwendet werden kann.

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

Gibt zurück

Ein IEnumerator Objekt, das die Elementauflistung darstellt.

Ausnahmen

Es wurde versucht, eine Spalte in einer geschlossenen DataTableReaderSpalte zu lesen oder darauf zuzugreifen.

Beispiele

Im folgenden Beispiel wird die Verwendung der GetEnumerator-Methode gezeigt. Dies schließt das Verhalten des Enumerators ein, wenn Zeilen aus dem zugrunde liegenden DataTable gelöscht werden, während der Enumerator aktiv ist.

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

Das Verfahren zeigt den folgenden Text im Konsolenfenster an:

Peter
Mary
Russ

Hinweise

Enumeratoren ermöglichen nur das Lesen der Daten in der DataTableReader. Enumeratoren können nicht zum Ändern der zugrunde liegenden Auflistung verwendet werden.

Zunächst wird der Enumerator vor dem ersten Element in der Auflistung positioniert. An dieser Position löst der Aufruf Current eine Ausnahme aus. Daher müssen Sie aufrufen MoveNext , um den Enumerator zum ersten Element der Auflistung vor dem Lesen des Werts Currentvon .

Current gibt ein DbDataRecord, und gibt dasselbe Objekt zurück, bis entweder MoveNext oder Reset aufgerufen wird. MoveNext wird auf das nächste Element festgelegt Current .

Nachdem das Ende der Auflistung übergeben wurde, wird der Enumerator nach dem letzten Element in der Auflistung positioniert, und der Aufruf MoveNext gibt "false" zurück. Wenn der letzte zurückzugebende MoveNextfalse Aufruf Current eine Ausnahme auslöst. Da der DataTableReader vorwärtsgeschützte Zugriff auf seine Daten ermöglicht, löst das Aufrufen der Reset Methode des IEnumerator eine .NotSupportedException

Dies DataTableReader stellt einen stabilen Enumerator bereit. Dies bedeutet, dass auch dann, wenn Zeilenlöschungen oder Ergänzungen innerhalb der zugrunde liegenden Daten auftreten, der von einem Aufruf GetEnumerator zurückgegebene Enumerator weiterhin gültig ist.

Gilt für: