Partilhar via


DataTableReader.GetEnumerator Método

Definição

Retorna um enumerador que pode ser usado para iterar na coleção de item.

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

Retornos

Um objeto IEnumerator que representa a coleção de itens.

Exceções

Foi feita uma tentativa de ler ou acessar uma coluna em um DataTableReader fechado.

Exemplos

O exemplo a seguir demonstra o uso do método GetEnumerator. Isso inclui o comportamento do enumerador quando as linhas são excluídas do subjacente DataTable enquanto o enumerador está ativo.

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

O procedimento exibe o seguinte texto na janela Console:

Peter  
Mary  
Russ  

Comentários

Os enumeradores só permitem a leitura dos dados no DataTableReader. Enumeradores não podem ser usados para modificar a coleção subjacente.

No início, o enumerador é posicionado antes do primeiro elemento na coleção. Nessa posição, chamar Current gera uma exceção. Por isso, você deve chamar MoveNext para avançar o enumerador até o primeiro elemento da coleção antes de ler o valor de Current.

Current retorna um DbDataRecorde retorna o mesmo objeto até MoveNext ou Reset ser chamado. MoveNext define Current como o próximo elemento.

Depois que o final da coleção é passado, o enumerador é posicionado após o último elemento na coleção e a chamada MoveNext retorna false. Se a última chamada para MoveNext retornada false, chamar Current gerará uma exceção. Além disso, como o DataTableReader fornece acesso somente encaminhamento aos seus dados, chamar o Reset método do IEnumerator gera um NotSupportedException.

O DataTableReader fornece um enumerador estável. Isso significa que, mesmo que as exclusões ou adições de linha ocorram dentro dos dados subjacentes, o enumerador retornado por uma chamada para GetEnumerator ainda é válido.

Aplica-se a