次の方法で共有


DataTableReader.GetEnumerator メソッド

定義

項目のコレクションを反復処理するために使用できる列挙子を返します。

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

戻り値

項目のコレクションを表す IEnumerator オブジェクト。

例外

閉じている DataTableReader の列を読み取るかアクセスしようとしました。

GetEnumerator メソッドの使用例を次に示します。 これには、列挙子がアクティブな間に基になる DataTable から行が削除されたときの列挙子の動作が含まれます。

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

このプロシージャは、コンソール ウィンドウに次のテキストを表示します。

Peter  
Mary  
Russ  

注釈

列挙子は、 内のデータの読み取りのみを許可します DataTableReader。 列挙子を使用して、基になるコレクションを変更することはできません。

最初は、列挙子はコレクション内の最初の要素の前に配置されます。 この位置で Current を呼び出すと、例外がスローされます。 そのため、MoveNext の値を読み取る前に、Current を呼び出して列挙子をコレクションの最初の要素に進める必要があります。

Currentは をDbDataRecord返し、 または Reset が呼び出されるまで同じオブジェクトをMoveNext返します。 MoveNext は、Current を次の要素に進めます。

コレクションの末尾が渡されると、列挙子はコレクション内の最後の要素の後に配置され、 を呼び出すと MoveNext false が返されます。 前回 MoveNext を呼び出して false が返された場合に、Current を呼び出すと例外がスローされます。 さらに、 はデータへの前方専用アクセスを提供するため DataTableReader 、IEnumerator の メソッドを Reset 呼び出すと が NotSupportedExceptionスローされます。

DataTableReader 、安定した列挙子を提供します。 つまり、基になるデータ内で行の削除や追加が行われても、 の GetEnumerator 呼び出しによって返される列挙子は引き続き有効です。

適用対象