SQL のパラメータ化されたストアド プロシージャを ODBC .NET プロバイダと Visual C# .NET を使用して実行する方法

文書翻訳 文書翻訳
文書番号: 310130 - 対象製品
この記事は、以前は次の ID で公開されていました: JP310130
すべて展開する | すべて折りたたむ

目次

概要

この資料では、ODBC .NET のマネージド プロバイダおよび Visual C# .NET を使用して、パラメータ化された SQL Server ストアド プロシージャを呼び出す方法について、手順を追って説明します。

パラメータ化されたストアド プロシージャを ODBC .NET プロバイダを使用して実行する方法と、SQL や OLE DB プロバイダを使用して同じプロシージャを呼び出す方法との違いはわずかですが、1 つ重要な違いがあります。つまり、ストアド プロシージャは、名前ではなく ODBC CALL 構文を使用して呼び出す必要があります。この CALL 構文の詳細については、MSDN ライブラリの ODBC Programmer's Reference で「Procedure Calls」を参照してください。

呼び出し構文の例

  1. Northwind サンプル データベースに実際に存在する、パラメータを 1 つ取るストアド プロシージャの呼び出し構文の例を示します。
    {CALL CustOrderHist (?)}
  2. 入力パラメータを 1 つ取り、1 つの出力パラメータと戻り値を返すストアド プロシージャの呼び出し構文の例を示します。最初のプレースホルダは戻り値を表します。
    {? = CALL Procedure1 (?, ?)
  3. ODBC .NET マネージド プロバイダは、OLE DB プロバイダと同様に、(0 から始まる) 序数と名前でパラメータを処理します。

テスト プロジェクト (単一の入力パラメータ)

  1. 次のマイクロソフト Web サイトから ODBC.NET マネージド プロバイダをダウンロードし、インストールします。
    http://www.microsoft.com/japan/msdn/data/default.asp
  2. Visual Studio .NET を起動し、任意のプロジェクト名を指定して Visual C# .NET の Windows アプリケーション プロジェクトを新規作成します。
  3. [プロジェクト] メニューの [参照の追加] をクリックし、[Microsoft.Data.ODBC.dll] をダブルクリックして、選択項目の一覧に追加します。[参照の追加] ダイアログ ボックスを閉じます。
  4. コード ウィンドウの最上部に次のステートメントを追加します。
    using System.Data;
    using Microsoft.Data.Odbc;
    					
  5. Button コントロールをツールボックスからデフォルトのフォームにドラッグします。
  6. コマンド ボタンをダブルクリックして、ボタンの Click イベントに対するコード ウィンドウに切り替えます。次のコードを Click イベント プロシージャに入力するか貼り付けます。SQL Server の接続文字列は必要に応じて編集してください。
    OdbcConnection cn;
    OdbcCommand cmd;
    OdbcParameter prm;
    OdbcDataReader dr;
    
    try {
        //Change the connection string to use your SQL Server.
        cn = new OdbcConnection("Driver={SQL Server};Server=servername;Database=Northwind;Trusted_Connection=Yes");
    
        //Use ODBC call syntax.
        cmd = new OdbcCommand("{call CustOrderHist (?)}", cn);
    
        prm = cmd.Parameters.Add("@CustomerID", OdbcType.Char, 5);
        prm.Value = "ALFKI";
    
        cn.Open();
    
        dr = cmd.ExecuteReader();
    
        //List each product.
        while (dr.Read()) 
    	Console.WriteLine(dr.GetString(0));
    
        //Clean up.
        dr.Close();
        cn.Close();
    }
    catch (OdbcException o) {
        MessageBox.Show(o.Message.ToString());
    }
    					
  7. プロジェクトを実行します。このコードによって CustOrderHist ストアド プロシージャが呼び出され、単一の入力パラメータとして CustomerID が渡され、結果セットが返されます。出力ウィンドウに、Northwind の得意先 ALFKI によって注文された製品の一覧が表示されます。

    : 出力ウィンドウを表示するには、Ctrl + Alt + O キーを押します。

テスト プロジェクト (複数のパラメータ型)

  1. クエリ アナライザを使用して、Northwind サンプル データベースに次のストアド プロシージャを作成します。このストアド プロシージャは、入力パラメータとして CustomerID を取り、その得意先による注文の一覧を返し、得意先によって支払われた注文あたりの平均運送料を出力パラメータとして返し、得意先による注文の数を戻り値として返します。
    CREATE PROCEDURE usp_TestParameters
    @CustID CHAR(5),
    @AvgFreight MONEY OUTPUT
    AS
    SELECT @AvgFreight = AVG(Freight) FROM Orders WHERE CustomerID = @CustID
    SELECT * FROM Orders WHERE CustomerID = @CustID
    RETURN @@ROWCOUNT
    					
  2. コマンド ボタンの Click イベント プロシージャで次のコードを置き換えて、手順 1. 〜 6. を繰り返します。
    OdbcConnection cn;
    
    try {
        cn = new OdbcConnection("Driver={SQL Server};Server=servername;Database=Northwind;Trusted_Connection=Yes");
    
        OdbcCommand cmd = new OdbcCommand("{? = call usp_TestParameters (?, ?)}", cn);
    
        OdbcParameter prm = cmd.Parameters.Add("@RETURN_VALUE", OdbcType.Int);
        prm.Direction = ParameterDirection.ReturnValue;
    
        prm = cmd.Parameters.Add("@CustomerID", OdbcType.Char, 5);
        prm.Value = "ALFKI";
    
        prm = cmd.Parameters.Add("@AvgFreight", OdbcType.Double);
        prm.Direction = ParameterDirection.Output;
    
        cn.Open();
        OdbcDataReader dr = cmd.ExecuteReader();
    
        while (dr.Read())
             Console.WriteLine(dr.GetString(0));
    
        dr.Close();
        cn.Close();
    
        Console.WriteLine("Average Freight (output param): {0}", cmd.Parameters[2].Value);
        Console.WriteLine("Order Count (return value): {0}", cmd.Parameters[0].Value);
    
    }
    
    catch (OdbcException o) {
        MessageBox.Show(o.Message.ToString());
    }
    					
  3. プロジェクトを実行します。このコードによって、上記の手順 1. で作成した usp_TestParameters ストアド プロシージャが呼び出され、単一の入力パラメータとして CustomerID が渡され、結果セット、出力パラメータおよび戻り値が返されます。出力ウィンドウに、Northwind の得意先 ALFKI による注文の一覧、得意先が支払った注文あたりの平均運送料、および注文の数が表示されます。

    : 出力ウィンドウを表示するには、Ctrl + Alt + O キーを押します。

トラブルシューティング

  • ストアド プロシージャの呼び出しに通常使用される ADO の構文 (プロシージャの名前を単独で CommandText として指定します) は、ODBC.NET マネージド プロバイダでは使用できません。
  • ストアド プロシージャが結果セットを返す場合、結果セットにアクセスして閉じるまで、出力パラメータと戻り値は利用できません。たとえば、上記のサンプル コード内で "dr.Close()" の行を省略した場合、出力パラメータの値を取り出して値を返すことはできません。
  • ODBC .NET マネージド プロバイダは、OLE DB プロバイダと同様に、(0 から始まる) 序数と名前でパラメータを処理します。
  • ODBC .NET マネージド プロバイダは Visual Studio .NET に含まれていないため、個別にダウンロードする必要があります。

関連情報

ODBC CALL 構文の詳細については、MSDN ライブラリの ODBC Programmer's Reference で「Procedure Calls」を参照してください。

プロパティ

文書番号: 310130 - 最終更新日: 2005年10月25日 - リビジョン: 3.2
この資料は以下の製品について記述したものです。
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
キーワード:?
kbdatabase kbhowtomaster kbsystemdata KB310130
"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