次の方法で共有


DataReader によってデータを取得する

適用対象: .NET Framework .NET .NET Standard

ADO.NET のダウンロード

DataReader を使用してデータを取得するには、Command オブジェクトのインスタンスを作成した後、Command.ExecuteReader を呼び出して DataReader を作成し、データ ソースから行を取得します。 DataReader では、手続きロジックがデータ ソースからの結果を順番に効率的に処理できるようにするバッファリングされないデータ ストリームが提供されます。

Note

DataReader はデータをメモリにキャッシュしないため、大量のデータを取得する場合に適しています。

DataReader を使用する例を次に示します。ここで、reader は有効な DataReader を、command は有効な Command オブジェクトを表します。

reader = command.ExecuteReader();  

クエリ結果から行を取得するには、DataReader.Read メソッドを使用します。 返された行の各列にアクセスするには、その列の名前または序数を DataReader に渡します。 ただし、DataReader では、最適のパフォーマンスが得られるように、ネイティブのデータ型を使用して列の値にアクセスできる一連のメソッド (GetDateTimeGetDoubleGetGuidGetInt32 など) が提供されています。 データ プロバイダー固有の DataReaders の型指定されたアクセサー メソッドの一覧については、「SqlDataReader」を参照してください。 基になるデータ型がわかっているときは、型指定されたアクセサー メソッドを使用すると、列の値を取得するときに必要な型変換の量が少なくなります。

次に、DataReader オブジェクトを反復処理して各行から 2 つの列を返す例を示します。

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

        SqlDataReader reader = command.ExecuteReader();

        // Check if the DataReader has any row.
        if (reader.HasRows)
        {
            // Obtain a row from the query result.
            while (reader.Read())
            {
                Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
                    reader.GetString(1));
            }
        }
        else
        {
            Console.WriteLine("No rows found.");
        }
        // Always call the Close method when you have finished using the DataReader object.
        reader.Close();
    }
}

DataReader を閉じる

DataReader オブジェクトを使い終えたら、Close() メソッドを必ず呼び出します。

Note

Command に出力パラメーターまたは戻り値が含まれている場合、DataReader が閉じられるまで、それらの値を使用することはできません。

重要

DataReader が開かれている間、Connection はその DataReader によって排他的に使用されています。 元の DataReader が閉じられるまでは、別の DataReader の作成など、どのようなコマンドもその Connection に対して実行できません。

Note

クラスの Finalize メソッド内では、ConnectionDataReader、またはその他のマネージド オブジェクトに対して、Close または Dispose を呼び出さないでください。 終了処理では、クラスに直接所有されているアンマネージ リソースだけを解放してください。 クラスがアンマネージド リソースを所有していない場合は、クラス定義に Finalize メソッドを含めないでください。 詳しくは、「ガベージ コレクション」をご覧ください。

NextResult による複数の結果セットの取得

DataReader から複数の結果セットが返される場合は、NextResult メソッドを呼び出して、結果セットを順番に反復処理します。 SqlDataReader メソッドを使用して、2 つの SELECT ステートメントの結果を処理する ExecuteReader の例を次に示します。

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();

        // Check if the DataReader has any row.
        while (reader.HasRows)
        {
            Console.WriteLine("\t{0}\t{1}", reader.GetName(0),
                reader.GetName(1));

            // Obtain a row from the query result.
            while (reader.Read())
            {
                Console.WriteLine("\t{0}\t{1}", reader.GetInt32(0),
                    reader.GetString(1));
            }

            // Hop to the next result-set.
            reader.NextResult();
        }
        // Always call the Close method when you have finished using the DataReader object.
        reader.Close();
    }
}

DataReader からのスキーマ情報の取得

DataReader が開かれている間に GetSchemaTable メソッドを使用して、現在の結果セットについてのスキーマ情報を取得できます。 GetSchemaTable は、現在の結果セットのスキーマ情報を含む行と列が設定されている DataTable オブジェクトを返します。 DataTable には結果セットの列ごとに 1 行が設定されます。 スキーマ テーブルの各列は、結果セットの行で返される列の 1 つのプロパティにマップされます。ColumnName はそのプロパティの名前であり、列の値はプロパティの値です。 DataReader のスキーマ情報を出力する例を次に示します。

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

        SqlDataReader reader = command.ExecuteReader();

        // Retrieve schema information about the current result-set.
        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]));
            }
        }

        // Always call the Close method when you have finished using the DataReader object.
        reader.Close();
    }
}

関連項目