Comparteix a través de


DataTableReader.GetEnumerator Método

Definición

Devuelve un enumerador que puede utilizarse para recorrer una iteración en la colección de elementos.

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

Devoluciones

Objeto IEnumerator que representa la colección de elementos.

Excepciones

Se ha intentado la lectura o el acceso a una columna en un objeto DataTableReader cerrado.

Ejemplos

En el siguiente ejemplo se muestra el uso del método GetEnumerator. Esto incluye el comportamiento del enumerador cuando las filas se eliminan del subyacente DataTable mientras el enumerador está activo.

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

El procedimiento muestra el texto siguiente en la ventana Consola:

Peter  
Mary  
Russ  

Comentarios

Los enumeradores solo permiten leer los datos de .DataTableReader Los enumeradores no se pueden usar para modificar la colección subyacente.

Al principio, el enumerador se coloca delante del primer elemento de la colección. En esta posición, la llamada Current produce una excepción. Por lo tanto, debe llamar a MoveNext para adelantar el enumerador hasta el primer elemento de la colección antes de leer el valor de Current.

Current devuelve un DbDataRecordy devuelve el mismo objeto hasta que MoveNext se llama a o Reset . MoveNext establece Current en el siguiente elemento.

Después de pasar el final de la colección, el enumerador se coloca después del último elemento de la colección y la llamada a MoveNext devuelve false. Si se devuelve falsela última llamada a MoveNext , al llamar Current se produce una excepción. Además, dado que DataTableReader proporciona acceso de solo avance a sus datos, al llamar al Reset método del IEnumerator se produce un NotSupportedException.

DataTableReader proporciona un enumerador estable. Esto significa que incluso si se producen eliminaciones de filas o adiciones dentro de los datos subyacentes, el enumerador devuelto por una llamada a GetEnumerator sigue siendo válido.

Se aplica a