次の方法で共有


方法: 多階層データベース アプリケーションをデバッグする

このトピックの内容は、次の製品に該当します。

Visual Studio Ultimate

Visual Studio Premium

Visual Studio Professional

Visual Studio Express

ms165062.DoesApplybmp(ja-jp,VS.100).gif ms165062.DoesApplybmp(ja-jp,VS.100).gif ms165062.DoesApplybmp(ja-jp,VS.100).gif ms165062.DoesNotApplybmp(ja-jp,VS.100).gif

このトピックでは、多階層データベース アプリケーションをデバッグする方法を示すサンプル コードを紹介します。また、クライアント アプリケーションまたは中間層アプリケーションに存在するアプリケーション コードからデータベース オブジェクトの Transact-SQL コードに入ってデバッグするために必要な手順について説明します。このデータベース オブジェクトは、SQL Server 2005 以降の SQL Server インスタンス内で実行されるものです。

アプリケーション層とデータベース層との間で移動するには、対象層にブレークポイントを設定する必要があります。ブレークポイントがないと、対象層にステップ インしようとしても、コードは停止せずに実行されるだけです。ただし、Transact-SQL とデータベース層内の SQL CLR コードとの間では、ブレークポイントがなくても移動が可能です。

次の例では、C# コンソール アプリケーションである SQL Server データベース テーブル (名前は Currency) と 2 つのストアド プロシージャを使用して、C# と Transact-SQL との間を自由に移動します。この例では、実際のビジネス上のシナリオではなく、移動の例を示すことを目的としています。

2 つのストアド プロシージャが呼び出されます。

  • DeleteCurrency は、指定された通貨コードを持つ通貨を削除する Transact-SQL ストアド プロシージャです。

  • DeleteCurrencyDriver も Transact-SQL ストアド プロシージャです。削除する通貨コードを指定する入力パラメーターを使用して、上のストアド プロシージャを呼び出します。

アプリケーション コードは、両方のストアド プロシージャを呼び出して、通貨コード パラメーターを渡します。"ドライバーでない" ストアド プロシージャは、2 つの異なるコンテキストから呼び出されます。1 つは DeleteCurrencyDriver であり、もう 1 つはアプリケーションから直接的にです。最初のコンテキストでは、[ステップ イン] ボタンをクリックすることにより、DeleteCurrencyDriver から他のストアド プロシージャにステップ インすることができます。これらのストアド プロシージャは、アプリケーションから呼び出されるときには、直接ステップ インすることはできません。ストアド プロシージャ内にブレークポイントを設定する必要があります。

このデモ用の Transact-SQL データベース オブジェクトの作成

  1. 選択した SQL Server 2005 以降のデータベースで、最初の例に示されたコードを使用して、Currency テーブルと 2 つのストアド プロシージャを作成します。

    1. Visual Studio で Transact-SQL エディターを開き、このデモに使用できるデータベースに接続します。詳細については、「方法: Transact-SQL エディターを起動する」および「方法: Transact-SQL エディターでデータベースに接続する」を参照してください。

    2. 最初の例から Transact-SQL コードをコピーして、Transact-SQL エディターに貼り付けます。

    3. <database> を該当するデータベース名に置き換えてから、Transact-SQL エディターのツール バーにある [SQL の実行] をクリックします。

  2. Transact-SQL エディターを SQL Server データベース プロジェクトまたはサーバー プロジェクトのコンテキストで開いた場合には、プロジェクトを閉じてから続行します。そうでない場合は、Transact-SQL エディターを開いたまま続行することができます。

多階層デバッグに備えたサーバー エクスプローラーの準備

  1. 使用するコンピューターで Transact-SQL デバッグ機能が有効であることを確認します。詳細については、「方法: Transact-SQL のデバッグを有効にする」を参照してください。

  2. [表示] メニューの [サーバー エクスプローラー] をクリックして、サーバー エクスプローラーを開きます。

  3. サーバー エクスプローラーで、データ接続を新規作成します。そのためには、[データ接続] を右クリックして [接続の追加] をクリックします。これにより、[接続の追加] ダイアログ ボックスが起動します。

  4. Currency テーブルを作成したデータベースへの接続を作成します。接続に使用されるログインが、sysadmin 固定サーバー ロールのメンバーであることが重要です。詳細については、「方法: サーバー エクスプローラーを使用してデータベースに接続する」を参照してください。

  5. データ接続の新規作成が完了したら、[データ接続] ノードでその接続を見つけます。

  6. 新しいデータ接続を右クリックして、[アプリケーションのデバッグ] をクリックします。これにより、接続で指定されたデータベースでの多階層デバッグが有効になります。

多階層デバッグに備えた C# コンソール アプリケーションの準備

  1. サーバー エクスプローラーで準備した同じ Visual Studio インスタンスで、DeleteCurrencyDriver および DeleteCurrency ストアド プロシージャを実行する C# コンソール アプリケーションを準備します。

    1. [ファイル] メニューの [新しいプロジェクト] をクリックして、新しい C# コンソール アプリケーションを開きます。

    2. 2 番目の例から C# コードをコピーして、プロジェクトによって作成された Program.cs ファイルのコードをすべて置き換えます。

  2. コンソール アプリケーション プロパティで、[デバッグ] タブの [SQL Server デバッグを有効にする] をクリックします。これにより、コンソール アプリケーションで多階層デバッグが有効になります。詳細については、「方法: C++、Visual Basic、または C# のプロジェクトで Transact-SQL のデバッグを有効にする」を参照してください。

多階層コンソール アプリケーションのデバッグ

  1. C# コード (Program.cs ファイル) で、ストアド プロシージャの各呼び出しの前後にブレークポイントを配置します。

  2. ストアド プロシージャにブレークポイントを配置します。メモ: C# コードから Transact-SQL コードにステップ インすることはできませんが、SQL Server データベース オブジェクト間を移動することはできます。

    1. サーバー エクスプローラーで、新しいデータ接続の下で新しいストアド プロシージャを見つけます。

    2. [DeleteCurrency] ストアド プロシージャを右クリックして、[開く] をクリックします。これにより、Transact-SQL エディター ウィンドウが起動して、DeleteCurrency ストアド プロシージャが表示されます。SET NOCOUNT ON 行にブレークポイントを設定します。そのためには、エディターの左側にある灰色のバー内をクリックします。

    3. [DeleteCurrencyDriver] ストアド プロシージャを右クリックして、[開く] をクリックします。これにより、Transact-SQL エディター ウィンドウが起動して、DeleteCurrencyDriver ストアド プロシージャが表示されます。SET NOCOUNT ON 行にブレークポイントを設定します。そのためには、エディターの左側にある灰色のバー内をクリックします。

  3. F5 キーを押してアプリケーションを実行します。

  4. さまざまなモジュール間をステップ実行します。

  5. ブレークポイントをいくつか削除して、さまざまな層間および言語間での移動が及ぼす影響を確認します。

  6. デバッグを終了するため、Visual Studio [デバッグ] メニューからブレークポイントをすべて消去して、F5 キーを押します。

使用例

Currency テーブルおよび 2 つのストアド プロシージャ DeleteCurrency および DeleteCurrencyDriver を作成する Transact-SQL コードを次に示します。<database> は、該当するデータベースの名前に置き換えてください。

USE <database>
GO
CREATE TABLE Currency
(CurrencyCode nvarchar(1))

INSERT Currency 
VALUES (N'A'),(N'B'),(N'C'),(N'D')

SELECT * FROM Currency 
GO

CREATE PROCEDURE dbo.DeleteCurrency
    (
        @CurrencyCode nvarchar(3)
    )
AS
    SET NOCOUNT ON
    DELETE Currency 
      WHERE CurrencyCode = @currencyCode 
    RETURN
GO

CREATE PROCEDURE dbo.DeleteCurrencyDriver
    (
        @CurrencyCode nvarchar(3)
    )
AS
    SET NOCOUNT ON
    EXECUTE DeleteCurrency @CurrencyCode 
    RETURN
GO

DeleteCurrencyDriver と DeleteCurrency の各ストアド プロシージャを呼び出すコンソール アプリケーションの C# コードを次に示します。<server> および <database> は、それぞれ Currency テーブルが存在するインスタンスとデータベースの名前に置き換えてください。

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
            builder.DataSource = <server>;
            builder.IntegratedSecurity = true;
            builder.InitialCatalog = <database>;
 
            SqlConnection SqlConnection1 = new SqlConnection(builder.ConnectionString);
            SqlConnection1.Open();
 
            SqlCommand procCommand = new SqlCommand();
            procCommand.CommandText = "DeleteCurrencyDriver";
            procCommand.CommandType = CommandType.StoredProcedure;
            procCommand.Connection = SqlConnection1;

            // Fill parameters collection for the stored procedure.SqlParameter workParam = null;
            workParam = procCommand.Parameters.Add("@CurrencyCode", SqlDbType.NChar, 1);
            procCommand.Parameters["@CurrencyCode"].Value = "B";
            
            try { procCommand.ExecuteNonQuery(); }
            catch (SqlException e) { Console.WriteLine(e.Message); }
 
            //Execute DeleteCurrency stored procedure directly
            procCommand.CommandText = "DeleteCurrency";
            try { procCommand.ExecuteNonQuery(); }
            catch (SqlException e) { Console.WriteLine(e.Message); }
 
            SqlConnection1.Close();
            Console.WriteLine("Press any key to close...");
            Console.Read();
        }
    }
}

関連項目

タスク

方法: C++、Visual Basic、または C# のプロジェクトで Transact-SQL のデバッグを有効にする

方法: 多階層デバッグを有効にする

方法: Transact-SQL のデバッグを有効にする