DataReader によるデータの取得Retrieving Data Using a DataReader

使用してデータの取得、 DataReaderのインスタンスを作成、コマンドオブジェクトを作成した後、 DataReader呼び出してCommand.ExecuteReaderデータ ソースから行を取得します。Retrieving data using a DataReader involves creating an instance of the Command object and then creating a DataReader by calling Command.ExecuteReader to retrieve rows from a data source. 次の例を使用して、 DataReader場所readerは有効な datareader とcommand有効な Command オブジェクトを表します。The following example illustrates using a DataReader where reader represents a valid DataReader and command represents a valid Command object.

reader = command.ExecuteReader();  

使用する、読み取りのメソッド、 DataReaderクエリの結果から行を取得するオブジェクト。You use the Read method of the DataReader object to obtain a row from the results of the query. 返された行の各列をアクセスするには、名前または列の序数参照を渡すことによって、 DataReaderします。You can access each column of the returned row by passing the name or ordinal reference of the column to the DataReader. ただし、最高のパフォーマンスについて、 DataReader一連のネイティブ データ型の列の値にアクセスできるようにするメソッドを提供します (GetDateTimeGetDoubleGetGuidGetInt32など)。However, for best performance, the DataReader provides a series of methods that allow you to access column values in their native data types (GetDateTime, GetDouble, GetGuid, GetInt32, and so on). データ プロバイダーに固有の型指定されたアクセサー メソッドの一覧についてはDataReadersを参照してくださいOleDbDataReaderSqlDataReaderします。For a list of typed accessor methods for data provider-specific DataReaders, see OleDbDataReader and SqlDataReader. 基になるデータ型がわかっている場合、型指定されたアクセサー メソッドを使用すると、列の値を取得するときに必要な型変換の量が少なくなります。Using the typed accessor methods, assuming the underlying data type is known, reduces the amount of type conversion required when retrieving the column value.

注意

.NET Framework の Windows Server 2003 のリリースには、追加のプロパティが含まれています、 DataReaderHasRows、かを判断することができるDataReaderがそこから読み取る前に結果を返した。The Windows Server 2003 release of the .NET Framework includes an additional property for the DataReader, HasRows, which enables you to determine if the DataReader has returned any results before reading from it.

次のコード例を反復処理をDataReaderオブジェクト、および各列から 2 つの列を返します。The following code example iterates through a DataReader object, and returns two columns from each row.

static void HasRows(SqlConnection connection)
{
    using (connection)
    {
        SqlCommand command = new SqlCommand(
          "SELECT CategoryID, CategoryName FROM Categories;",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        if (reader.HasRows)
        {
            while (reader.Read())
            {
                Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
                    reader.GetString(1));
            }
        }
        else
        {
            Console.WriteLine("No rows found.");
        }
        reader.Close();
    }
}
Private Sub HasRows(ByVal connection As SqlConnection)
    Using connection
        Dim command As SqlCommand = New SqlCommand( _
          "SELECT CategoryID, CategoryName FROM Categories;", _
          connection)
        connection.Open()

        Dim reader As SqlDataReader = command.ExecuteReader()

        If reader.HasRows Then
            Do While reader.Read()
                Console.WriteLine(reader.GetInt32(0) _
                  & vbTab & reader.GetString(1))
            Loop
        Else
            Console.WriteLine("No rows found.")
        End If

        reader.Close()
    End Using
End Sub

DataReaderは手続き型のロジックを効率的にデータ ソースからの結果を順番に処理を可能にするデータのバッファリングされていないストリームを提供します。The DataReader provides an unbuffered stream of data that allows procedural logic to efficiently process results from a data source sequentially. DataReaderデータがメモリにキャッシュされていないため、大量のデータを取得するときにお勧めします。The DataReader is a good choice when retrieving large amounts of data because the data is not cached in memory.

DataReader の終了Closing the DataReader

常に呼び出す必要があります、閉じるメソッドを使用してが完了したら、 DataReaderオブジェクト。You should always call the Close method when you have finished using the DataReader object.

場合、コマンドの出力を含むパラメーターまたは戻り値の場合は、これらは使用できませんまで、 DataReaderが閉じられました。If your Command contains output parameters or return values, they will not be available until the DataReader is closed.

注意してください、 DataReaderが開いて、接続によって排他的に使用されてDataReaderします。Note that while a DataReader is open, the Connection is in use exclusively by that DataReader. 任意のコマンドを実行することはできません、接続、もう 1 つ作成を含むDataReader、まで、元のDataReaderが閉じられました。You cannot execute any commands for the Connection, including creating another DataReader, until the original DataReader is closed.

注意

呼び出さないでください閉じるまたはDispose上、接続DataReader、またはその他のマネージ オブジェクトで、 Finalizeクラスのメソッド。Do not call Close or Dispose on a Connection, a DataReader, or any other managed object in the Finalize method of your class. 終了処理では、クラスに直接所有されているアンマネージ リソースだけを解放してください。In a finalizer, only release unmanaged resources that your class owns directly. クラスがアンマネージ リソースを所有していない場合は含まれません、 Finalizeメソッド、クラス定義にします。If your class does not own any unmanaged resources, do not include a Finalize method in your class definition. 詳細については、次を参照してください。ガベージ コレクションします。For more information, see Garbage Collection.

NextResult による複数の結果セットの取得Retrieving Multiple Result Sets using NextResult

複数の結果セットが返された場合、 DataReader提供、 NextResultの順序で結果を反復処理するメソッドを設定します。If multiple result sets are returned, the DataReader provides the NextResult method to iterate through the result sets in order. SqlDataReader メソッドを使用して、2 つの SELECT ステートメントの結果を処理する ExecuteReader の例を次に示します。The following example shows the SqlDataReader processing the results of two SELECT statements using the ExecuteReader method.

static void RetrieveMultipleResults(SqlConnection connection)
{
    using (connection)
    {
        SqlCommand command = new SqlCommand(
          "SELECT CategoryID, CategoryName FROM dbo.Categories;" +
          "SELECT EmployeeID, LastName FROM dbo.Employees",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        while (reader.HasRows)
        {
            Console.WriteLine("\t{0}\t{1}", reader.GetName(0),
                reader.GetName(1));

            while (reader.Read())
            {
                Console.WriteLine("\t{0}\t{1}", reader.GetInt32(0),
                    reader.GetString(1));
            }
            reader.NextResult();
        }
    }
}
Private Sub RetrieveMultipleResults(ByVal connection As SqlConnection)
    Using connection
        Dim command As SqlCommand = New SqlCommand( _
          "SELECT CategoryID, CategoryName FROM Categories;" & _
          "SELECT EmployeeID, LastName FROM Employees", connection)
        connection.Open()

        Dim reader As SqlDataReader = command.ExecuteReader()

        Do While reader.HasRows
            Console.WriteLine(vbTab & reader.GetName(0) _
              & vbTab & reader.GetName(1))

            Do While reader.Read()
                Console.WriteLine(vbTab & reader.GetInt32(0) _
                  & vbTab & reader.GetString(1))
            Loop

            reader.NextResult()
        Loop
    End Using
End Sub

DataReader からのスキーマ情報の取得Getting Schema Information from the DataReader

中に、 DataReaderは開くことができますを取得する設定を使用して現在の結果に関するスキーマ情報、 GetSchemaTableメソッド。While a DataReader is open, you can retrieve schema information about the current result set using the GetSchemaTable method. GetSchemaTableを返します、DataTable行と、現在の結果セットのスキーマ情報を含む列を含むオブジェクト。GetSchemaTable returns a DataTable object populated with rows and columns that contain the schema information for the current result set. DataTable結果セットの列ごとに 1 つの行が含まれています。The DataTable contains one row for each column of the result set. スキーマ テーブル行の各列に返される列のプロパティにマップ、結果セット、 ColumnNameプロパティの名前であり、列の値は、プロパティの値。Each column of the schema table row maps to a property of the column returned in the result set, where the ColumnName is the name of the property and the value of the column is the value of the property. 次のコード例のスキーマ情報を書き込みますDataReaderします。The following code example writes out the schema information for DataReader.

static void GetSchemaInfo(SqlConnection connection)
{
    using (connection)
    {
        SqlCommand command = new SqlCommand(
          "SELECT CategoryID, CategoryName FROM Categories;",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();
        DataTable schemaTable = reader.GetSchemaTable();

        foreach (DataRow row in schemaTable.Rows)
        {
            foreach (DataColumn column in schemaTable.Columns)
            {
                Console.WriteLine(String.Format("{0} = {1}",
                   column.ColumnName, row[column]));
            }
        }
    }
}
Private Sub GetSchemaInfo(ByVal connection As SqlConnection)
    Using connection
        Dim command As SqlCommand = New SqlCommand( _
          "SELECT CategoryID, CategoryName FROM Categories;", _
          connection)
        connection.Open()

        Dim reader As SqlDataReader = command.ExecuteReader()
        Dim schemaTable As DataTable = reader.GetSchemaTable()

        Dim row As DataRow
        Dim column As DataColumn

        For Each row In schemaTable.Rows
            For Each column In schemaTable.Columns
                Console.WriteLine(String.Format("{0} = {1}", _
                  column.ColumnName, row(column)))
            Next
            Console.WriteLine()
        Next
        reader.Close()
    End Using
End Sub

OLE DB のチャプターの使用Working with OLE DB Chapters

階層的な行セット、つまりチャプター (OLE DB 型DBTYPE_HCHAPTER、ADO 型adChapter) を使用して取得できます、OleDbDataReaderします。Hierarchical rowsets, or chapters (OLE DB type DBTYPE_HCHAPTER, ADO type adChapter) can be retrieved using the OleDbDataReader. チャプターを含むクエリとして返される場合、 DataReader、章を内の列として返されますDataReaderとして公開されると、 DataReaderオブジェクト。When a query that includes a chapter is returned as a DataReader, the chapter is returned as a column in that DataReader and is exposed as a DataReader object.

ADO.NETデータセットテーブル間の親子リレーションシップを使用して階層的な行セットを表すためも使用できます。The ADO.NET DataSet can also be used to represent hierarchical rowsets using parent-child relationships between tables. 詳細については、次を参照してください。 Dataset、Datatable、および Dataviewします。For more information, see DataSets, DataTables, and DataViews.

MSDataShape プロバイダーを使用して、顧客リストの顧客別オーダーのチャプター列を生成するコード サンプルを次に示します。The following code example uses the MSDataShape Provider to generate a chapter column of orders for each customer in a list of customers.

Using connection As OleDbConnection = New OleDbConnection( _  
  "Provider=MSDataShape;Data Provider=SQLOLEDB;" & _  
  "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind")  

Dim custCMD As OleDbCommand = New OleDbCommand( _  
  "SHAPE {SELECT CustomerID, CompanyName FROM Customers} " & _  
  "APPEND ({SELECT CustomerID, OrderID FROM Orders} AS CustomerOrders " & _  
  "RELATE CustomerID TO CustomerID)", connection)  
connection.Open()  

Dim custReader As OleDbDataReader = custCMD.ExecuteReader()  
Dim orderReader As OleDbDataReader  

Do While custReader.Read()  
  Console.WriteLine("Orders for " & custReader.GetString(1))   
  ' custReader.GetString(1) = CompanyName  

  orderReader = custReader.GetValue(2)  
  ' custReader.GetValue(2) = Orders chapter as DataReader  

  Do While orderReader.Read()  
    Console.WriteLine(vbTab & orderReader.GetInt32(1))  
    ' orderReader.GetInt32(1) = OrderID  
  Loop  
  orderReader.Close()  
Loop  
' Make sure to always close readers and connections.  
custReader.Close()  
End Using  
Using (OleDbConnection connection = new OleDbConnection(  
  "Provider=MSDataShape;Data Provider=SQLOLEDB;" +  
  "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"));  
{  
OleDbCommand custCMD = new OleDbCommand(  
  "SHAPE {SELECT CustomerID, CompanyName FROM Customers} " +  
  "APPEND ({SELECT CustomerID, OrderID FROM Orders} AS CustomerOrders " +  
  "RELATE CustomerID TO CustomerID)", connection);  
connection.Open();  

OleDbDataReader custReader = custCMD.ExecuteReader();  
OleDbDataReader orderReader;  

while (custReader.Read())  
{  
  Console.WriteLine("Orders for " + custReader.GetString(1));   
  // custReader.GetString(1) = CompanyName  

  orderReader = (OleDbDataReader)custReader.GetValue(2);        
  // custReader.GetValue(2) = Orders chapter as DataReader  

  while (orderReader.Read())  
    Console.WriteLine("\t" + orderReader.GetInt32(1));          
    // orderReader.GetInt32(1) = OrderID  
  orderReader.Close();  
}  
// Make sure to always close readers and connections.  
custReader.Close();  
}  

Oracle REF CURSOR による結果の取得Returning Results with Oracle REF CURSORs

.NET Framework Data Provider for Oracle は、クエリ結果を返すために、Oracle REF CURSOR の使用をサポートしています。The .NET Framework Data Provider for Oracle supports the use of Oracle REF CURSORs to return a query result. Oracle REF CURSOR は OracleDataReader として返されます。An Oracle REF CURSOR is returned as an OracleDataReader.

取得することができます、 OracleDataReaderオブジェクトを使用して、Oracle REF CURSOR を表す、ExecuteReaderメソッドをおよびするを指定できますも、OracleCommandとして 1 つまたは複数の Oracle REF Cursor を返す、 SelectCommandOracleDataAdapter塗りつぶしに使用される、DataSetします。You can retrieve an OracleDataReader object, that represents an Oracle REF CURSOR using the ExecuteReader method, and you can also specify an OracleCommand that returns one or more Oracle REF CURSORs as the SelectCommand for an OracleDataAdapter used to fill a DataSet.

Oracle データ ソースから返された REF CURSOR にアクセスするには、作成、 OracleCommand 、クエリの REF CURSOR を参照する出力パラメーターを追加し、パラメーター のコレクションOracleCommandします。To access a REF CURSOR returned from an Oracle data source, create an OracleCommand for your query and add an output parameter that references the REF CURSOR to the Parameters collection of your OracleCommand. パラメーターの名前は、クエリの REF CURSOR パラメーターの名前と一致させる必要があります。The name of the parameter must match the name of the REF CURSOR parameter in your query. 設定するパラメーターの型OracleType.Cursorします。Set the type of the parameter to OracleType.Cursor. ExecuteReaderのメソッド、 OracleCommandが返されます、 OracleDataReader REF CURSOR の。The ExecuteReader method of your OracleCommand will return an OracleDataReader for the REF CURSOR.

場合、 OracleCommand複数の REF CURSOR を返す複数の出力パラメーターを追加します。If your OracleCommand returns multiple REF CURSORS, add multiple output parameters. それぞれの REF Cursor を呼び出すことによってアクセスできる、 OracleCommand.ExecuteReaderメソッド。You can access the different REF CURSORs by calling the OracleCommand.ExecuteReader method. 呼び出しExecuteReaderを返します、 OracleDataReader最初の REF CURSOR を参照します。The call to ExecuteReader returns an OracleDataReader referencing the first REF CURSOR. 呼び出して、 OracleDataReader.NextResult後続の REF Cursor にアクセスするメソッド。You can then call the OracleDataReader.NextResult method to access subsequent REF CURSORs. パラメーター、 OracleCommand.Parametersコレクションの一致、REF CURSOR 出力パラメーターを名前で、 OracleDataReader に追加された順序でそれらにアクセスします。パラメーターコレクション。Although the parameters in your OracleCommand.Parameters collection match the REF CURSOR output parameters by name, the OracleDataReader accesses them in the order that they were added to the Parameters collection.

たとえば、次のような Oracle パッケージとパッケージ本体があるとします。For example, consider the following Oracle package and package body.

CREATE OR REPLACE PACKAGE CURSPKG AS   
  TYPE T_CURSOR IS REF CURSOR;   
  PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,   
    DEPTCURSOR OUT T_CURSOR);   
END CURSPKG;  

CREATE OR REPLACE PACKAGE BODY CURSPKG AS   
  PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT T_CURSOR,   
    DEPTCURSOR OUT T_CURSOR)   
  IS   
  BEGIN   
    OPEN EMPCURSOR FOR SELECT * FROM DEMO.EMPLOYEE;   
    OPEN DEPTCURSOR FOR SELECT * FROM DEMO.DEPARTMENT;   
  END OPEN_TWO_CURSORS;   
END CURSPKG;   

次のコード作成、 OracleCommand型の 2 つのパラメーターを追加することで、前のバージョンの Oracle パッケージから REF Cursor を返すOracleType.Cursorパラメーターコレクション。The following code creates an OracleCommand that returns the REF CURSORs from the previous Oracle package by adding two parameters of type OracleType.Cursor to the Parameters collection.

Dim cursCmd As OracleCommand = New OracleCommand("CURSPKG.OPEN_TWO_CURSORS", oraConn)  
cursCmd.Parameters.Add("EMPCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output  
cursCmd.Parameters.Add("DEPTCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output  
OracleCommand cursCmd = new OracleCommand("CURSPKG.OPEN_TWO_CURSORS", oraConn);  
cursCmd.Parameters.Add("EMPCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output;  
cursCmd.Parameters.Add("DEPTCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output;  

次のコードを使用して前のコマンドの結果を返します、読み取りNextResultのメソッド、 OracleDataReaderします。The following code returns the results of the previous command using the Read and NextResult methods of the OracleDataReader. REF CURSOR パラメーターは順番に返されます。The REF CURSOR parameters are returned in order.

oraConn.Open()  

Dim cursCmd As OracleCommand = New OracleCommand("CURSPKG.OPEN_TWO_CURSORS", oraConn)  
cursCmd.CommandType = CommandType.StoredProcedure  
cursCmd.Parameters.Add("EMPCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output  
cursCmd.Parameters.Add("DEPTCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output  

Dim reader As OracleDataReader = cursCmd.ExecuteReader()  

Console.WriteLine(vbCrLf & "Emp ID" & vbTab & "Name")  

Do While reader.Read()  
  Console.WriteLine("{0}" & vbTab & "{1}, {2}", reader.GetOracleNumber(0), reader.GetString(1), reader.GetString(2))  
Loop  

reader.NextResult()  

Console.WriteLine(vbCrLf & "Dept ID" & vbTab & "Name")  

Do While reader.Read()  
  Console.WriteLine("{0}" & vbTab & "{1}", reader.GetOracleNumber(0), reader.GetString(1))  
Loop  
' Make sure to always close readers and connections.  
reader.Close()  
oraConn.Close()  
oraConn.Open();  

OracleCommand cursCmd = new OracleCommand("CURSPKG.OPEN_TWO_CURSORS", oraConn);  
cursCmd.CommandType = CommandType.StoredProcedure;  
cursCmd.Parameters.Add("EMPCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output;  
cursCmd.Parameters.Add("DEPTCURSOR", OracleType.Cursor).Direction = ParameterDirection.Output;  

OracleDataReader reader = cursCmd.ExecuteReader();  

Console.WriteLine("\nEmp ID\tName");  

while (reader.Read())  
  Console.WriteLine("{0}\t{1}, {2}", reader.GetOracleNumber(0), reader.GetString(1), reader.GetString(2));  

reader.NextResult();  

Console.WriteLine("\nDept ID\tName");  

while (reader.Read())  
  Console.WriteLine("{0}\t{1}", reader.GetOracleNumber(0), reader.GetString(1));  
// Make sure to always close readers and connections.  
reader.Close();  
oraConn.Close();  

次の例では、前のコマンドを使用して、事前設定、データセットOracle パッケージの結果。The following example uses the previous command to populate a DataSet with the results of the Oracle package.

注意

回避するために、 OverflowException、有効な .NET Framework 型に値を格納する前に、Oracle の NUMBER 型から変換を処理することをお勧め、 DataRowTo avoid an OverflowException, we recommend that you also handle any conversion from the Oracle NUMBER type to a valid .NET Framework type before storing the value in a DataRow. 使用することができます、 FillErrorイベントかどうかをOverflowExceptionが発生しました。You can use the FillError event to determine if an OverflowException has occurred. 詳細については、 FillErrorイベントを参照してくださいDataAdapter イベントの処理します。For more information on the FillError event, see Handling DataAdapter Events.

Dim ds As DataSet = New DataSet()  

Dim adapter As OracleDataAdapter = New OracleDataAdapter(cursCmd)  
adapter.TableMappings.Add("Table", "Employees")  
adapter.TableMappings.Add("Table1", "Departments")  

adapter.Fill(ds)  
DataSet ds = new DataSet();  

OracleDataAdapter adapter = new OracleDataAdapter(cursCmd);  
adapter.TableMappings.Add("Table", "Employees");  
adapter.TableMappings.Add("Table1", "Departments");  

adapter.Fill(ds);  

関連項目See Also

Datareader の操作Working with DataReaders
DataAdapter と DataReaderDataAdapters and DataReaders
コマンドおよびパラメーターCommands and Parameters
データベース スキーマ情報の取得Retrieving Database Schema Information
ADO.NET のマネージド プロバイダーと DataSet デベロッパー センターADO.NET Managed Providers and DataSet Developer Center