次の方法で共有


ストアド プロシージャのデバッグ (VB)

スコット・ミッチェル著

PDF をダウンロードする

Visual Studio Professional エディションと Team System エディションでは、SQL Server 内のストアド プロシージャにブレークポイントを設定してステップ インできるため、ストアド プロシージャのデバッグはアプリケーション コードのデバッグと同じくらい簡単になります。 このチュートリアルでは、ストアド・プロシージャの直接データベース・デバッグとアプリケーション・デバッグについて説明します。

イントロダクション

Visual Studio は、豊富なデバッグ エクスペリエンスを提供します。 数回のキーストロークまたはマウスのクリックで、ブレークポイントを使用してプログラムの実行を停止し、その状態と制御フローを調べることができます。 Visual Studio では、アプリケーション コードのデバッグに加えて、SQL Server 内からのストアド プロシージャのデバッグもサポートしています。 ブレークポイントを ASP.NET 分離コード クラスまたはビジネス ロジック レイヤー クラスのコード内に設定できるのと同様に、ストアド プロシージャ内に配置することもできます。

このチュートリアルでは、Visual Studio 内のサーバー エクスプローラーからストアド プロシージャにステップ インする方法と、実行中の ASP.NET アプリケーションからストアド プロシージャが呼び出されたときにヒットするブレークポイントを設定する方法について説明します。

残念ながら、ストアド プロシージャは、Professional バージョンと Team Systems バージョンの Visual Studio を使用してのみステップインしてデバッグできます。 Visual Web Developer または標準バージョンの Visual Studio を使用している場合は、ストアド プロシージャのデバッグに必要な手順を順を追って説明しながらお読みいただけますが、これらの手順をコンピューター上でレプリケートすることはできません。

SQL Server のデバッグの概念

Microsoft SQL Server 2005 は、すべての .NET アセンブリで使用されるランタイムである 共通言語ランタイム (CLR) との統合を提供するように設計されています。 したがって、SQL Server 2005 はマネージ データベース オブジェクトをサポートします。 つまり、ストアド プロシージャや User-Defined 関数 (UDF) などのデータベース オブジェクトを Visual Basic クラスのメソッドとして作成できます。 これにより、これらのストアド プロシージャと UDF では、.NET Framework および独自のカスタム クラスの機能を利用できます。 もちろん、SQL Server 2005 は T-SQL データベース オブジェクトもサポートしています。

SQL Server 2005 では、T-SQL オブジェクトとマネージ データベース オブジェクトの両方に対してデバッグがサポートされています。 ただし、これらのオブジェクトは、Visual Studio 2005 Professional エディションと Team Systems エディションでのみデバッグできます。 このチュートリアルでは、T-SQL データベース オブジェクトのデバッグについて説明します。 次のチュートリアルでは、マネージ・データベース・オブジェクトのデバッグについて説明します。

SQL Server 2005 CLR Integration チームのブログ記事「Overview of T-SQL and CLR Debugging in SQL Server 2005 (SQL Server 2005 での T-SQL と CLR デバッグの概要)」では、Visual Studio から SQL Server 2005 オブジェクトをデバッグする 3 つの方法を紹介しています。

  • ダイレクト データベース デバッグ (DDD) - サーバー エクスプローラーから、ストアド プロシージャや UDF などの任意の T-SQL データベース オブジェクトにステップ インできます。 ステップ 1 で DDD について検討します。
  • アプリケーションのデバッグ - データベースオブジェクト内にブレークポイントを設定してから、ASP.NET アプリケーションを実行できます。 データベース オブジェクトが実行されると、ブレークポイントにヒットし、制御がデバッガーに引き渡されます。 アプリケーションのデバッグでは、アプリケーション コードからデータベース オブジェクトにステップ インできないことに注意してください。 デバッガーを停止するストアド プロシージャまたは UDF にブレークポイントを明示的に設定する必要があります。 アプリケーションのデバッグは、手順 2 から調べられます。
  • SQL Server プロジェクトからのデバッグ - Visual Studio Professional エディションと Team Systems エディションには、マネージド データベース オブジェクトの作成に一般的に使用される SQL Server プロジェクトの種類が含まれています。 次のチュートリアルでは、SQL Server プロジェクトの使用とその内容のデバッグについて説明します。

Visual Studio では、ローカルおよびリモートの SQL Server インスタンスでストアド プロシージャをデバッグできます。 ローカル SQL Server インスタンスは、Visual Studio と同じマシンにインストールされているインスタンスです。 使用している SQL Server データベースが開発用マシン上にない場合、そのデータベースはリモート インスタンスと見なされます。 これらのチュートリアルでは、ローカルの SQL Server インスタンスを使用しています。 リモート SQL サーバ インスタンスでストアド プロシージャをデバッグするには、ローカル インスタンスでストアド プロシージャをデバッグする場合よりも多くの設定手順が必要です。

ローカルの SQL Server インスタンスを使用している場合は、手順 1 から始めて、このチュートリアルを最後まで進めることができます。 ただし、リモート SQL Server インスタンスを使用している場合は、デバッグ時に、リモート インスタンスに SQL Server ログインを持つ Windows ユーザー アカウントを使用して開発マシンにログインしていることを確認する必要があります。 さらに、このデータベース ログインと、実行中の ASP.NET アプリケーションからデータベースに接続するために使用されるデータベース ログインの両方が、 sysadmin ロールのメンバーである必要があります。 リモート インスタンスをデバッグするための Visual Studio と SQL Server の構成の詳細については、このチュートリアルの最後にある「リモート インスタンスでの T-SQL データベース オブジェクトのデバッグ」セクションを参照してください。

最後に、T-SQL データベース オブジェクトのデバッグ サポートは、.NET アプリケーションのデバッグ サポートほど機能が豊富ではないことを理解してください。 たとえば、ブレークポイントの条件とフィルターがサポートされていない、デバッグ ウィンドウの一部のみが使用可能である、エディット コンティニュを使用できない、イミディエイト ウィンドウが役に立たなくなる、などです。 詳細については 、「デバッガーのコマンドと機能の制限 」を参照してください。

ステップ 1: ストアド・プロシージャに直接ステップ イン

Visual Studio では、データベース オブジェクトを直接簡単にデバッグできます。 ダイレクト データベース デバッグ (DDD) 機能を使用して、Northwind データベースの Products_SelectByCategoryID ストアド プロシージャにステップ インする方法を見てみましょう。 その名前が示すように、 Products_SelectByCategoryID は特定のカテゴリの製品情報を返します。これは、「 型指定されたデータセットの TableAdapters の既存のストアド プロシージャの使用 」チュートリアルで作成されました。 まず、サーバー エクスプローラーに移動し、Northwind データベース ノードを展開します。 次に、[ストアド プロシージャ] フォルダーにドリルダウンし、 Products_SelectByCategoryID ストアド プロシージャを右クリックして、コンテキスト メニューから [ストアド プロシージャにステップ イン] オプションを選択します。 これにより、デバッガーが起動します。

Products_SelectByCategoryIDストアドプロシージャは@CategoryID入力パラメータを想定しているため、この値を指定するように求められます。 1 を入力すると、飲み物に関する情報が返されます。

<span class= @CategoryID Parameter" /> に値 1 を使用します

図 1: @CategoryID パラメーターに値 1 を使用する

@CategoryID パラメータに値を指定すると、ストアド プロシージャが実行されます。 ただし、デバッガーは完了するまで実行するのではなく、最初のステートメントで実行を停止します。 余白の黄色の矢印は、ストアド プロシージャの現在の位置を示しています。 パラメータ値を表示および編集するには、[ウォッチ] ウィンドウを使用するか、ストアド プロシージャのパラメータ名にカーソルを合わせます。

デバッガーは、ストアド プロシージャの最初のステートメントで停止しました

図 2: ストアド プロシージャの最初のステートメントでデバッガーが停止しました (フルサイズの画像を表示する をクリックします)。

ストアド・プロシージャを一度に 1 つのステートメントでステップ実行するには、ツールバーの [ステップ オーバー] ボタンをクリックするか、F10 キーを押します。 Products_SelectByCategoryID ストアド プロシージャには 1 つの SELECT ステートメントが含まれているため、F10 キーを押すと 1 つのステートメントがステップ オーバーされ、ストアド プロシージャの実行が完了します。 ストアド プロシージャが完了すると、その出力が [出力] ウィンドウに表示され、デバッガーが終了します。

T-SQL デバッグはステートメント レベルで行われます。 SELECT ステートメントにステップインすることはできません。

ステップ 2: Web サイトをアプリケーションのデバッグ用に構成する

ストアド プロシージャをサーバー エクスプローラから直接デバッグするのも便利ですが、多くのシナリオでは、ASP.NET アプリケーションからストアド プロシージャが呼び出されたときのデバッグに関心があります。 Visual Studio 内からストアド プロシージャにブレークポイントを追加し、ASP.NET アプリケーションのデバッグを開始できます。 ブレークポイントを持つストアド プロシージャがアプリケーションから呼び出されると、実行はブレークポイントで停止し、ステップ 1 で行ったのと同様に、ストアド プロシージャのパラメーター値を表示および変更し、そのステートメントをステップ実行できます。

アプリケーションから呼び出されたストアド プロシージャのデバッグを開始する前に、ASP.NET Web アプリケーションに SQL Server デバッガーと統合するように指示する必要があります。 まず、ソリューション エクスプローラー (ASPNET_Data_Tutorial_74_VB) で Web サイト名を右クリックします。 コンテキスト メニューから [プロパティ ページ] オプションを選択し、左側の [開始オプション] 項目を選択し、[デバッガー] セクションの [SQL Server] チェック ボックスをオンにします (図 3 参照)。

アプリケーションのプロパティ ページの [SQL Server] チェック ボックスをオンにします

図 3: アプリケーションのプロパティ ページで [SQL Server] チェック ボックスをオンにします (フルサイズの画像を表示する をクリックします)。

さらに、アプリケーションで使用されるデータベース接続文字列を更新して、接続プーリングを無効にする必要があります。 データベースへの接続が閉じられると、対応する SqlConnection オブジェクトが使用可能な接続のプールに配置されます。 データベースへの接続を確立すると、新しい接続を作成して確立する代わりに、このプールから使用可能な接続オブジェクトを取得できます。 この接続オブジェクトのプーリングはパフォーマンスの向上であり、デフォルトで有効になっています。 ただし、デバッグ時には、プールから取得した接続を操作するときにデバッグ インフラストラクチャが正しく再確立されないため、接続プールをオフにする必要があります。

接続プールを無効にするには、NORTHWNDConnectionStringWeb.config を更新して、 Pooling=false の設定が含まれるようにします。

<connectionStrings>
    <add name="NORTHWNDConnectionString" connectionString=
        "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\NORTHWND.MDF;
            Integrated Security=True;User Instance=True;Pooling=false"
        providerName="System.Data.SqlClient" />
</connectionStrings>

ASP.NET アプリケーションを使用して SQL Server のデバッグが完了したら、接続文字列から Pooling 設定を削除 (または Pooling=true に設定して) 接続プールを復元してください。

この時点で、ASP.NET アプリケーションは、Web アプリケーションを介して呼び出されたときに Visual Studio が SQL Server データベース オブジェクトをデバッグできるように構成されています。 あとは、ストアド プロシージャにブレークポイントを追加してデバッグを開始するだけです。

ステップ 3: ブレークポイントの追加とデバッグ

Products_SelectByCategoryID ストアド・プロシージャを開き、適切な場所のマージンをクリックするか、SELECT ステートメントの先頭にカーソルを置いて F9 キーを押して、SELECT ステートメントの先頭にブレークポイントを設定します。 図 4 に示すように、ブレークポイントは余白に赤い円として表示されます。

Products_SelectByCategoryIDストアドプロシージャにブレークポイントを設定する

図 4: Products_SelectByCategoryID ストアド プロシージャにブレークポイントを設定する (フルサイズの画像を表示する をクリックします)

クライアント アプリケーションを使用して SQL データベース オブジェクトをデバッグするには、アプリケーションのデバッグをサポートするようにデータベースを構成する必要があります。 ブレークポイントを初めて設定すると、この設定は自動的にオンになりますが、再確認することをお勧めします。 Server Explorerで NORTHWND.MDF ノードを右クリックします。 コンテキスト メニューには、[アプリケーション デバッグ] という名前のチェック メニュー項目が含まれている必要があります。

アプリケーションデバッグオプションが有効になっていることを確認します

図 5: アプリケーション デバッグ オプションが有効になっていることを確認する

ブレークポイントを設定し、[アプリケーション デバッグ] オプションを有効にすると、ASP.NET アプリケーションから呼び出されたときにストアド プロシージャをデバッグする準備が整います。 デバッガーを起動するには、[デバッグ] メニューに移動して [デバッグの開始] を選択するか、F5 キーを押すか、ツール バーの緑色の再生アイコンをクリックします。 これにより、デバッガーが起動し、Web サイトが起動します。

Products_SelectByCategoryIDストアド プロシージャは、型指定されたデータセットの TableAdapters の既存のストアド プロシージャの使用チュートリアルで作成されました。 対応する Web ページ (~/AdvancedDAL/ExistingSprocs.aspx) には、このストアド プロシージャによって返された結果を表示する GridView が含まれています。 ブラウザからこのページにアクセスしてください。 ページに到達すると、 Products_SelectByCategoryID ストアド プロシージャのブレークポイントがヒットし、制御が Visual Studio に戻ります。 手順 1 と同様に、ストアド プロシージャの s ステートメントをステップ実行し、パラメーター値を表示および変更できます。

ExistingSprocs.aspxページには、最初に飲み物が表示されます

図 6: ExistingSprocs.aspx ページに最初に飲み物が表示されます (フルサイズの画像を表示する をクリックします)。

ストアド プロシージャのブレークポイントに達しました

図 7: ストアド プロシージャのブレークポイントに到達しました (フルサイズの画像を表示する をクリックします)。

図 7 の [ウォッチ] ウィンドウに示すように、 @CategoryID パラメーターの値は 1 です。 これは、 ExistingSprocs.aspx ページに最初に飲料カテゴリの商品が表示され、 CategoryID 値が 1 であるためです。 ドロップダウンリストから別のカテゴリを選択します。 これを行うと、ポストバックが発生し、 Products_SelectByCategoryID ストアド プロシージャが再実行されます。 ブレークポイントは再度ヒットしますが、今回は @CategoryID パラメーターの s 値に、選択したドロップダウン リスト項目の CategoryIDが反映されます。

Drop-Down リストから別のカテゴリを選択

図 8: Drop-Down リストから別のカテゴリを選択する (フルサイズの画像を表示する をクリックします)

<span class= @CategoryID パラメータは、Web ページから選択したカテゴリを反映します" />

図 9: @CategoryID パラメーターは、Web ページから選択したカテゴリを反映しています (フルサイズの画像を表示する をクリックします)。

Products_SelectByCategoryID ページにアクセスしたときに ExistingSprocs.aspx ストアド プロシージャのブレークポイントにヒットしない場合は、ASP.NET アプリケーションの [プロパティ] ページの [デバッガー] セクションで [SQL Server] チェック ボックスがオンになっていること、接続プールが無効になっていること、およびデータベースの [アプリケーション デバッグ] オプションが有効になっていることを確認します。 それでも問題が解決しない場合は、Visual Studio を再起動して、もう一度やり直してください。

リモート インスタンスでの T-SQL データベース オブジェクトのデバッグ

SQL Server データベース インスタンスが Visual Studio と同じコンピューター上にある場合、Visual Studio を使用したデータベース オブジェクトのデバッグは非常に簡単です。 ただし、SQL Server と Visual Studio が異なるマシン上にある場合は、すべてを適切に動作させるために慎重な構成が必要です。 私たちが直面している2つの主要なタスクがあります。

  • ADO.NET 経由でデータベースに接続するために使用したログインが sysadmin ロールに属していることを確認します。
  • 開発用コンピューター上の Visual Studio で使用される Windows ユーザー アカウントが、 sysadmin ロールに属する有効な SQL Server ログイン アカウントであることを確認します。

最初のステップは比較的簡単です。 まず、ASP.NET アプリケーションからデータベースへの接続に使用したユーザー アカウントを特定し、次に SQL Server Management Studio から、そのログイン アカウントを sysadmin ロールに追加します。

2 番目のタスクでは、アプリケーションのデバッグに使用する Windows ユーザ・アカウントが、リモート・データベースに有効なログインである必要があります。 ただし、ワークステーションにログオンしたWindowsアカウントがSQL Serverで有効なログインでない可能性があります。 特定のログイン アカウントを SQL Server に追加するよりも、一部の Windows ユーザー アカウントを SQL Server デバッグ アカウントとして指定することをお勧めします。 次に、リモート SQL Server インスタンスのデータベース オブジェクトをデバッグするには、その Windows ログイン アカウントの資格情報を使用して Visual Studio を実行します。

例は、物事を明確にするのに役立つはずです。 Windows ドメイン内に SQLDebug という名前の Windows アカウントがあるとします。 このアカウントは、有効なログインとして、また sysadmin ロールのメンバーとして、リモート SQL Server インスタンスに追加する必要があります。 次に、Visual Studio からリモート SQL Server インスタンスをデバッグするには、Visual Studio を SQLDebug ユーザーとして実行する必要があります。 これは、ワークステーションからログアウトし、 SQLDebugとして再度ログインしてから Visual Studio を起動することで実行できますが、より簡単な方法は、自分の資格情報を使用してワークステーションにログインし、 runas.exe を使用して Visual Studio を SQLDebug ユーザーとして起動することです。 runas.exe 特定のアプリケーションを異なるユーザーアカウントを装って実行できるようにします。 Visual Studio を SQLDebug として起動するには、コマンド ラインに次のステートメントを入力します。

runas.exe /user:SQLDebug "%PROGRAMFILES%\Microsoft Visual Studio 8\Common7\IDE\devenv.exe"

このプロセスの詳細については、 William R. Vaughn の「 Hitchhiker s Guide to Visual Studio and SQL Server, Seventh Edition」を参照してください。

開発マシンで Windows XP Service Pack 2 を実行している場合は、リモート デバッグを許可するようにインターネット接続ファイアウォールを構成する必要があります。 「SQL Server 2005 のデバッグを有効にする 方法」の記事では、これには (a) Visual Studio ホスト コンピュータで [例外] リストに Devenv.exe を追加し、TCP 135 ポートを開く必要があること、(b) リモート (SQL) コンピュータで TCP 135 ポートを開き、 sqlservr.exe を [例外] リストに追加する必要があること、の 2 つの手順が必要であることが記載されています。 ドメイン ポリシーでネットワーク通信を IPSec 経由で行う必要がある場合は、UDP 4500 ポートと UDP 500 ポートを開く必要があります。

概要

Visual Studio には、.NET アプリケーション コードのデバッグ サポートだけでなく、SQL Server 2005 のさまざまなデバッグ オプションも用意されています。 このチュートリアルでは、これらのオプションのうちの 2 つ (直接データベース デバッグとアプリケーション デバッグ) について説明しました。 T-SQL データベース オブジェクトを直接デバッグするには、サーバー エクスプローラーでオブジェクトを見つけて右クリックし、[ステップ イン] を選択します。 これにより、デバッガーが起動し、データベース オブジェクト内の最初のステートメントで停止します。この時点で、オブジェクトのステートメントをステップ実行し、パラメーター値を表示および変更できます。 手順 1 では、このアプローチを使用して Products_SelectByCategoryID ストアド プロシージャにステップ インしました。

アプリケーションのデバッグでは、ブレークポイントをデータベース オブジェクト内に直接設定できます。 ブレークポイントを持つデータベースオブジェクトがクライアントアプリケーション (ASP.NET Web アプリケーションなど) から呼び出されると、デバッガーが引き継ぐため、プログラムは停止します。 アプリケーションのデバッグは、特定のデータベース オブジェクトが呼び出される原因となるアプリケーション アクションをより明確に示すため便利です。 ただし、Direct Database Debugging よりも少し多くの構成とセットアップが必要です。

データベース オブジェクトは、SQL Server プロジェクトを使用してデバッグすることもできます。 次のチュートリアルでは、SQL Server プロジェクトの使用方法と、それらを使用してマネージド データベース オブジェクトを作成およびデバッグする方法について説明します。

プログラミングに満足!

著者について

7 冊の ASP/ASP.NET 書籍の著者であり、4GuysFromRolla.com の創設者である Scott Mitchell は、1998 年から Microsoft Web テクノロジを使用しています。 Scott は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズ・ティーチ・セルフ ASP.NET 24時間で2.0です。 彼には mitchell@4GuysFromRolla.comで連絡できます。