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

作成者: Scott Mitchell

PDF のダウンロード

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

はじめに

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

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

注意

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

SQL Server デバッグの概念

Microsoft SQL Server 2005 は、すべての .NET アセンブリで使用されるランタイムである共通言語ランタイム (CLR) との統合を提供するように設計されています。 そのため、SQL Server 2005 ではマネージド データベース オブジェクトがサポートされます。 つまり、ストアド プロシージャや User-Defined Functions (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 統合チームの「SQL Server 2005 の T-SQL とCLR のデバッグの概要」のブログ エントリでは、Visual Studio から SQL Server 2005 オブジェクトをデバッグする 3 つの方法が強調表示されています。

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

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

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

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

手順 1: ストアド プロシージャに直接ステップインする

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

ストアド プロシージャには Products_SelectByCategoryID 入力パラメーターが @CategoryID 必要であるため、この値を指定するように求められます。 「1」と入力すると、飲料に関する情報が返されます。

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

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

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

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

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

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

注意

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

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

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

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

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

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

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

接続プールを無効にするには、 設定が NORTHWNDConnectionString 含まれるように を Web.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 データベース オブジェクトをデバッグするには、アプリケーションのデバッグをサポートするようにデータベースを構成する必要があります。 最初にブレークポイントを設定すると、この設定は自動的にオンになりますが、ダブルチェックすることをお勧めします。 サーバー エクスプローラー内のNORTHWND.MDFノードを右クリックします。 コンテキスト メニューには、アプリケーション デバッグ という名前のチェックされたメニュー項目が含まれている必要があります。

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

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

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

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

[ExistingSprocs.aspx] ページには、最初に飲料が表示されます

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

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

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

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

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

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

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

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

注意

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

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

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 アカウントがあるとします。 このアカウントは、有効なログインとして、およびロールのメンバーとして、リモート SQL Server インスタンスに追加するsysadmin必要があります。 次に、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'sHitchhiker s Guide to Visual Studio and SQL Server, Seventh Edition」を参照してください。

注意

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

まとめ

Visual Studio では、.NET アプリケーション コードのデバッグ サポートに加えて、SQL Server 2005 用のさまざまなデバッグ オプションも提供されています。 このチュートリアルでは、次の 2 つのオプションを確認しました。データベースの直接デバッグとアプリケーションのデバッグです。 T-SQL データベース オブジェクトを直接デバッグするには、Server エクスプローラーを介してオブジェクトを見つけて右クリックし、[ステップ イン] を選択します。 これにより、デバッガーが起動し、データベース オブジェクト内の最初のステートメントで停止します。その時点で、オブジェクトの ステートメントをステップ実行し、パラメーター値を表示および変更できます。 手順 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 は、独立したコンサルタント、トレーナー、ライターとして働いています。 彼の最新の本は サムズは24時間で2.0 ASP.NET 自分自身を教えています。 にアクセスするか、ブログを使用して にアクセスmitchell@4GuysFromRolla.comできます。これは でhttp://ScottOnWriting.NET見つけることができます。