DataTableReader.GetEnumerator Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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 einem geschlossenen DataTableReader 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
Die Prozedur zeigt den folgenden Text im Konsolenfenster an:
Peter
Mary
Russ
Hinweise
Enumeratoren ermöglichen nur das Lesen der Daten im DataTableReader. Enumeratoren können nicht verwendet werden, um die zugrunde liegende Auflistung zu ändern.
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 muss der Enumerator durch einen Aufruf von MoveNext
auf das erste Element der Auflistung gesetzt werden, bevor der Wert von Current
gelesen werden kann.
Current
gibt ein DbDataRecordzurück, und gibt dasselbe Objekt zurück, bis entweder MoveNext oder Reset aufgerufen wird. MoveNext
legt Current
auf das nächste Element fest.
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 Aufruf von MoveNext
zurückgegeben wurde false
, löst der Aufruf Current
eine Ausnahme aus. Da außerdem Vorwärtszugriff DataTableReader auf seine Daten ermöglicht, löst der Aufruf der Reset IEnumerator-Methode eine aus NotSupportedException.
stellt DataTableReader einen stabilen Enumerator bereit. Dies bedeutet, dass der von einem Aufruf GetEnumerator von zurückgegebene Enumerator weiterhin gültig ist, auch wenn Zeilenlöschungen oder -ergänzungen innerhalb der zugrunde liegenden Daten auftreten.