次の方法で共有


IDataReader.NextResult メソッド

定義

バッチ SQL ステートメントの結果を読み取っているときに、次の結果にデータ リーダーを進めます。

public:
 bool NextResult();
public bool NextResult ();
abstract member NextResult : unit -> bool
Public Function NextResult () As Boolean

戻り値

次の行が存在する場合は true。それ以外の場合は false

注釈

複数の結果を処理するために使用されます。これは、バッチ SQL ステートメントを実行することで取得できます。

既定では、データ リーダーは最初の結果に配置されます。

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Data.Odbc;

class Program
{
    static void Main(string[] args)
    {
        string connectionTypeName = "OleDb";
        string connectionString = @"Provider=SQLNCLI11;Data Source=(local);Initial Catalog=AdventureWorks;Integrated Security=SSPI";

        using (IDbConnection connection = DatabaseConnectionFactory.GetConnection(connectionTypeName, connectionString))
        {
            IDbCommand command = connection.CreateCommand();
            command.Connection = connection;

            // these 2 queries are executed as a single batch and return 2 separate results
            command.CommandText = "SELECT CountryRegionCode, Name FROM Person.CountryRegion;" + "SELECT CountryRegionCode, StateProvinceCode, Name, StateProvinceID FROM Person.StateProvince;";

            connection.Open();

            using (IDataReader reader = command.ExecuteReader())
            {

                // process the first result
                displayCountryRegions(reader);

                // use NextResult to move to the second result and verify it is returned
                if (!reader.NextResult())
                    throw new InvalidOperationException("Expected second result (StateProvinces) but only one was returned");

                // process the second result
                displayStateProvinces(reader);

                reader.Close();
            }

            connection.Close();
        }
    }

    static void displayCountryRegions(IDataReader reader)
    {
        if (reader.FieldCount != 2)
            throw new InvalidOperationException("First resultset (CountryRegions) must contain exactly 2 columns");

        while (reader.Read())
        {
            Console.WriteLine("CountryRegionCode={0}, Name={1}"
                , reader.GetString(reader.GetOrdinal("CountryRegionCode"))
                , reader.GetString(reader.GetOrdinal("Name")));
        }
    }

    static void displayStateProvinces(IDataReader reader)
    {
        if (reader.FieldCount != 4)
            throw new InvalidOperationException("Second resultset (StateProvinces) must contain exactly 4 columns");

        while (reader.Read())
        {
            Console.WriteLine("CountryRegionCode={0}, StateProvinceCode={1}, Name={2}, StateProvinceID={3}"
                , reader.GetString(reader.GetOrdinal("CountryRegionCode"))
                , reader.GetString(reader.GetOrdinal("StateProvinceCode"))
                , reader.GetString(reader.GetOrdinal("Name"))
                , reader.GetInt32(reader.GetOrdinal("StateProvinceID")));
        }
    }

    class DatabaseConnectionFactory
    {
        static SqlConnection GetSqlConnection(string connectionString)
        {
            return new SqlConnection(connectionString);
        }

        static OdbcConnection GetOdbcConnection(string connectionString)
        {
            return new OdbcConnection(connectionString);
        }

        static OleDbConnection GetOleDbConnection(string connectionString)
        {
            return new OleDbConnection(connectionString);
        }

        public static IDbConnection GetConnection(string connectionTypeName, string connectionString)
        {
            switch (connectionTypeName)
            {
                case "SqlClient":
                    return GetSqlConnection(connectionString);
                case "Odbc":
                    return GetOdbcConnection(connectionString);
                case "OleDb":
                    return GetOleDbConnection(connectionString);
                default:
                    throw new ArgumentException("Value must be SqlClient, Odbc, or OleDb", "connectionTypeName");
            }
        }
    }
}
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.OleDb
Imports System.Data.Odbc

Module Module1
   Dim connectionTypeName As String = "SqlClient"
   Dim connectionString As String = "Data Source=(local);Initial Catalog=AdventureWorks2012;Integrated Security=SSPI"

   Sub Main()
      Using connection As IDbConnection = DatabaseConnectionFactory.GetConnection(connectionTypeName, connectionString)
         Dim command As IDbCommand = connection.CreateCommand()
         command.Connection = connection

         'These 2 queries are executed as a single batch and return 2 separate results.
         command.CommandText =
             "SELECT CountryRegionCode, Name FROM Person.CountryRegion;" +
             "SELECT CountryRegionCode, StateProvinceCode, Name, StateProvinceID FROM Person.StateProvince;"

         connection.Open()

         Using reader As IDataReader = command.ExecuteReader()
            'process the first result
            displayCountryRegions(reader)

            'use NextResult to move to the second result and verify it is returned
            If Not reader.NextResult() Then
               Throw New InvalidOperationException("Expected second result (StateProvinces) but only one was returned")
            End If

            'process the second result
            displayStateProvinces(reader)

            reader.Close()
         End Using

         connection.Close()
      End Using
   End Sub

   Sub displayCountryRegions(reader As IDataReader)
      If Not reader.FieldCount = 2 Then
         Throw New InvalidOperationException("First resultset (CountryRegions) must contain exactly 2 columns")
      End If

      While reader.Read()
         Console.WriteLine("CountryRegionCode={0}, Name={1}" _
             , reader.GetString(reader.GetOrdinal("CountryRegionCode")) _
             , reader.GetString(reader.GetOrdinal("Name")))
      End While
   End Sub

   Sub displayStateProvinces(reader As IDataReader)

      If Not reader.FieldCount = 4 Then
         Throw New InvalidOperationException("Second resultset (StateProvinces) must contain exactly 4 columns")
      End If

      While reader.Read()
         Console.WriteLine("CountryRegionCode={0}, StateProvinceCode={1}, Name={2}, StateProvinceID={3}" _
             , reader.GetString(reader.GetOrdinal("CountryRegionCode")) _
             , reader.GetString(reader.GetOrdinal("StateProvinceCode")) _
             , reader.GetString(reader.GetOrdinal("Name")) _
             , reader.GetInt32(reader.GetOrdinal("StateProvinceID")))
      End While
   End Sub

   Class DatabaseConnectionFactory
      Shared Function GetSqlConnection(connectionString As String) As SqlConnection
         Return New SqlConnection(connectionString)
      End Function

      Shared Function GetOdbcConnection(connectionString As String) As OdbcConnection
         Return New OdbcConnection(connectionString)
      End Function

      Shared Function GetOleDbConnection(connectionString As String) As OleDbConnection
         Return New OleDbConnection(connectionString)
      End Function

      Public Shared Function GetConnection(connectionTypeName As String, connectionString As String) As IDbConnection

         Select Case connectionTypeName
            Case "SqlClient"
               Return GetSqlConnection(connectionString)
            Case "Odbc"
               Return GetOdbcConnection(connectionString)
            Case "OleDb"
               Return GetOleDbConnection(connectionString)
            Case Else
               Throw New ArgumentException("Value must be SqlClient, Odbc or OleDb", "connectionTypeName")
         End Select

      End Function
   End Class
End Module

適用対象