DataTableReader.GetEnumerator Metod

Definition

Returnerar en uppräknare som kan användas för att iterera genom objektsamlingen.

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

Returer

Ett IEnumerator objekt som representerar objektsamlingen.

Undantag

Ett försök gjordes att läsa eller komma åt en kolumn i en stängd DataTableReader.

Exempel

I följande exempel visas användningen av metoden GetEnumerator. Detta inkluderar uppräknarens beteende när rader tas bort från den underliggande DataTable medan uppräknaren är aktiv.

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

Proceduren visar följande text i konsolfönstret:

Peter
Mary
Russ

Kommentarer

Uppräknare tillåter endast läsning av data i DataTableReader. Uppräknare kan inte användas för att ändra den underliggande samlingen.

Först placeras uppräknaren före det första elementet i samlingen. I det här läget utlöser anrop Current ett undantag. Därför måste du anropa MoveNext för att flytta uppräknaren till det första elementet i samlingen innan du läser värdet Currentför .

Current returnerar ett DbDataRecordoch returnerar samma objekt tills antingen MoveNext eller Reset anropas. MoveNext anger Current till nästa element.

När slutet av samlingen har skickats placeras uppräknaren efter det sista elementet i samlingen och anropet MoveNext returnerar false. Om det senaste anropet till MoveNext returnerade falseutlöser anropet Current ett undantag. Dessutom, eftersom DataTableReader ger framåtriktad åtkomst till sina data, anropar Reset metoden för IEnumerator genererar en NotSupportedException.

Ger DataTableReader en stabil uppräknare. Det innebär att även om radborttagningar eller tillägg sker inom underliggande data är uppräknaren som returneras av ett anrop till GetEnumerator fortfarande giltig.

Gäller för