HOW TO は、ADO を使用して、パラメーター化されたストアド プロシージャを呼び出します。NET と Visual C# で。NET

文書翻訳 文書翻訳
文書番号: 310070
この記事は、以前は次の ID で公開されていました: JP310070
すべて展開する | すべて折りたたむ

目次

概要

ADO を使用するのには、いくつかの方法です。NET を使用してストアド プロシージャを呼び出すと、戻り値が返さし、などのパラメーターを取得する:
  • 返される行を収集し、これらの行に加えて戻り値と出力パラメーターを処理するのには、 DataSetオブジェクトを使用します。
  • これらの行をし、戻り値と出力パラメーターに移動して、返される行を収集するためには、 DataReaderオブジェクトを使用します。
  • ExecuteScalarメソッドを使用して、戻り値と出力パラメーターを結果の最初の行の最初の列から値を取得します。これは、集計関数が最も便利です。
  • 戻り値のパラメーターおよび戻り値を返すには、 ExecuteNonQueryメソッドを使用します。返された行は破棄されます。これは、アクション クエリを実行するために便利です。
この資料では、最後の 3 つの方法について説明し、 SqlCommandOleDbCommandオブジェクトの両方を使用します。使用しているマネージド プロバイダーに対応するコードのみをコピーするようにしてください。どのマネージ プロバイダーを使用する必要がありますかわからない場合は、次のマイクロソフト開発者向けネットワークの Web サイトを参照してください。
.NET データ プロバイダー
各サンプルでは、この資料では、パラメーターは、 CommandオブジェクトのParametersコレクションに追加されます。SqlCommandオブジェクトを使用するとはないがパラメーターを追加、特定の順序でがパラメーターを適切な名前が必要があります。OleDbCommandオブジェクトを使用するを正しい順序でパラメーターを追加する必要があり、名前でパラメーターを使用することはできません。

DataReader を使用して行およびパラメーターを取得するのには

読み取り専用、順方向専用のデータ ストリームを取得するのにには、 DataReaderオブジェクトを使用できます。DataReaderに含まれる情報は、ストアド プロシージャから取得できます。この例では、 DataReaderオブジェクトを使用して、入力と出力パラメーターと戻りパラメーターを表示するには、返された各レコードを移動するストアド プロシージャを実行します。
  1. Microsoft SQL Server を実行しているサーバー上で次のストアド プロシージャを作成します。
    Create Procedure TestProcedure
    (
      @au_idIN varchar (11),
      @numTitlesOUT Integer OUTPUT
    )
    AS 
    
    select A.au_fname, A.au_lname, T.title 
    from authors as A join titleauthor as TA on
    A.au_id=TA.au_id
    join titles as T
    on T.title_id=TA.title_id
    where A.au_id=@au_idIN
    set @numTitlesOUT = @@Rowcount
    return (5) 
    					
  2. 新しい Visual C# で作成します。NET の Windows アプリケーション プロジェクトです。
  3. コードの後半でこれらの名前空間の宣言を修飾する必要がないようにシステムSystem.Data名前空間にusingステートメントを使用します。このコードをフォームのコード モジュールの先頭に追加します。選択したプロバイダーのコードのみをコピーすることを確認してください。SQL クライアント
    using System.Data.SqlClient;
    					
    OLE DB データ プロバイダー
    using System.Data.OleDb;
    					
  4. 秘密のForm_Loadイベント内のコードを次のコードに置き換えます:SQL クライアント
    SqlConnection PubsConn = new SqlConnection 
    ("Data Source=server;integrated " + 
    "Security=sspi;initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand 
    ("TestProcedure", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    SqlParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add 
      ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    SqlParameter NumTitles = testCMD.Parameters.Add 
       ("@numtitlesout", SqlDbType.VarChar, 11);
    NumTitles.Direction = ParameterDirection.Output ;
            
    IdIn.Value = "213-46-8915";
    PubsConn.Open();
    
    SqlDataReader myReader = testCMD.ExecuteReader();
    Console.WriteLine ("Book Titles for this Author:");
    while (myReader.Read()) 
       {
         Console.WriteLine ("{0}", myReader.GetString (2));
       };
    myReader.Close() ;
    Console.WriteLine("Number of Rows: " + NumTitles.Value );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
    OLE DB データ プロバイダー
    OleDbConnection PubsConn = new OleDbConnection 
       ("Provider=SQLOLEDB;Data Source=server;" + 
       "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand 
       ("TestProcedure", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    OleDbParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", OleDbType.Integer);RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    OleDbParameter NumTitles = testCMD.Parameters.Add 
       ("@numtitlesout", OleDbType.VarChar, 11);
    NumTitles.Direction = ParameterDirection.Output;
            
    IdIn.Value = "213-46-8915";
    
    PubsConn.Open();
    
    OleDbDataReader myReader = testCMD.ExecuteReader();
    Console.WriteLine ("Book Titles for this Author:");
    while (myReader.Read()) 
       {
         Console.WriteLine ("{0}", myReader.GetString (2));
       };
    myReader.Close() ;
    Console.WriteLine("Number of Rows: " + NumTitles.Value );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
  5. SQL Server を実行しているコンピューターに接続するには、 Connectionオブジェクトの接続文字列を変更します。
  6. コードを実行します。DataReaderは、レコードを取得し、パラメーターの値を返しますに注意してください。返された各レコードを移動するには、 DataReaderオブジェクトのReadメソッドを使用できます。

    「出力」ウィンドウには、2 つ書籍のタイトル、戻り値の 5、および数の記録 (2) が入った出力パラメーターが表示されます。パラメーターの値を表示するのには、 DataReaderのコードを閉じる必要があることを確認します。さらに、 DataReaderが閉じられている場合、戻り値パラメーターを参照してください。 すべてのレコードを移動する必要はないに注意してください。

Command オブジェクトの ExecuteScalar メソッドを使用します。

パラメーターの値を取得するのにには、 CommandオブジェクトのExecuteScalarメソッドを使用できます。また、 ExecuteScalarはストアド プロシージャの 1 行目の最初の列を返します。これは、集計関数を次の例のようにするときに便利です。
  1. SQL Server を実行しているサーバー上で次のストアド プロシージャを作成します。
    Create Procedure TestProcedure2
    (
      @au_idIN varchar (11)
    )
    As
    /* set nocount on */ 
    select count (T.title) 
    from authors as A join titleauthor as TA on
    A.au_id=TA.au_id
    join titles as T
    on T.title_id=TA.title_id
    where A.au_id=@au_idIN
    Return(5)
    					
  2. 新しい Visual C# で作成します。NET の Windows アプリケーション プロジェクトです。
  3. コードの後半でこれらの名前空間の宣言を修飾する必要がないようにシステムSystem.Data名前空間にusingステートメントを使用します。このコードをフォームのコード モジュールの先頭に追加します。選択したプロバイダーのコードのみをコピーすることを確認してください。SQL クライアント
    using System.Data.SqlClient;
    					
    OLE DB データ プロバイダー
    using System.Data.OleDb;
    					
  4. Form_Loadイベントに次のコードを追加:SQL クライアント
    string strCount;
    SqlConnection PubsConn = new SqlConnection 
       ("Data Source=server;integrated " + 
       "Security=sspi;initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand 
       ("TestProcedure2", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    SqlParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
            
    IdIn.Value = "213-46-8915";
    
    PubsConn.Open();
    
    strCount =testCMD.ExecuteScalar ().ToString() ;
    
    Console.WriteLine("Number of Rows: " + strCount );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
    OLE DB データ プロバイダー
    string strCount;
    OleDbConnection PubsConn = new OleDbConnection 
       ("Provider=SQLOLEDB;Data Source=server;" + 
       "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand 
       ("TestProcedure2", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    OleDbParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", OleDbType.Integer);
    RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    
    IdIn.Value = "213-46-8915";
    
    PubsConn.Open();
    
    strCount = testCMD.ExecuteScalar().ToString() ;
    
    Console.WriteLine("Number of Rows: " + strCount);
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
  5. SQL Server を実行しているコンピューターに接続するには、 Connectionオブジェクトの接続文字列を変更します。
  6. コードを実行します。CommandオブジェクトのExecuteScalarメソッドがパラメーターを返すことに注意してください。ExecuteScalarも 1,、返された行セットの行 1 の列の値を返します。そのため、 intCountの値はストアド プロシージャからのカウント関数の結果です。

Command オブジェクトの ExecuteNonQuery メソッドを使用します。

このサンプルは、クエリを実行して、パラメーターの値を返す、 ExecuteNonQueryメソッドを使用します。ExecuteNonQueryはクエリを実行すると、影響を受けるレコードの数を返します。ただし、 ExecuteNonQueryは行または列、ストアド プロシージャから返されません。

ExecuteNonQueryメソッドは行の数を変更しなければならない場合、INSERT、UPDATE、または DELETE ステートメントを使用する場合に便利です。SELECT ステートメントのみを使用しているストアド プロシージャでは、クエリが影響する行はないため-1 となります。
  1. SQL Server を実行しているコンピューターで次のストアド プロシージャを作成します。
    Create Procedure TestProcedure3
    (
      @au_idIN varchar (11),
      @au_fnam varchar (30)
    )
    
    As
    /* set nocount on */ 
    Update authors set au_fname = @au_fnam
    where au_id = @au_idin	
    return (5)
    					
  2. 新しい Visual C# で作成します。NET の Windows アプリケーション プロジェクトです。
  3. コードの後半でこれらの名前空間の宣言を修飾する必要がないようにシステムSystem.Data名前空間にusingステートメントを使用します。このコードをフォームのコード モジュールの先頭に追加します。選択したプロバイダーのコードのみをコピーすることを確認してください。SQL クライアント
    using System.Data.SqlClient;
    					
    OLE DB データ プロバイダー
    using System.Data.OleDb;
    					
  4. 秘密のForm1_Loadイベント、Form1 のコード モジュールに以下のコードを次のコードに置き換えます:SQL クライアント
    string strRowAffect;
    SqlConnection PubsConn = new SqlConnection 
       ("Data Source=server;integrated Security=sspi;" + 
       "initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand 
       ("TestProcedure3", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    SqlParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    SqlParameter FnameIn = testCMD.Parameters.Add 
       ("@au_fnam", SqlDbType.VarChar, 30);
    FnameIn.Direction = ParameterDirection.Input;
    
    IdIn.Value = "213-46-8915";
    FnameIn.Value = "Marjorie";
    
    PubsConn.Open();
    
    strRowAffect =testCMD.ExecuteNonQuery ().ToString() ;
    
    Console.WriteLine("Number of Rows: " + strRowAffect );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
    OLE DB データ プロバイダー
    int intRowAffected;
    OleDbConnection PubsConn = new OleDbConnection 
       ("Provider=SQLOLEDB;Data Source=server;" + 
       "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand 
       ("TestProcedure3", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    OleDbParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", OleDbType.Integer);
    RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    OleDbParameter FnameIn = testCMD.Parameters.Add
       ("@au_fname", OleDbType.VarChar, 30);
    FnameIn.Direction = ParameterDirection.Input;
    
    IdIn.Value = "213-46-8915";
    FnameIn.Value = "Marjorie";
    
    PubsConn.Open();
    intRowAffected = testCMD.ExecuteNonQuery();
    
    Console.WriteLine("Number of Rows affected: " + intRowAffected);
    Console.WriteLine(RetVal.Value);
    					
  5. SQL Server を実行しているコンピューターに接続するには、 Connectionオブジェクトの接続文字列を変更します。
  6. コードを実行します。[出力] ウィンドウには、(intRowAffect) の影響を受ける行の数、および戻りパラメーターの値が表示されます。

関連情報

詳細については、次の MSDN Web サイトを参照してください。
紹介をします。NET Framework クラス ライブラリ

DataReader を使用してデータを取得しています。

プロパティ

文書番号: 310070 - 最終更新日: 2012年6月12日 - リビジョン: 1.0
キーワード:?
kbhowtomaster kbstoredproc kbsqlclient kbsystemdata kbmt KB310070 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:310070
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com