このトピックの内容は、次の製品に該当します。
Visual Studio Ultimate |
Visual Studio Premium |
Visual Studio Professional |
Visual Studio Express |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
このトピックでは、多階層データベース アプリケーションをデバッグする方法を示すサンプル コードを紹介します。また、クライアント アプリケーションまたは中間層アプリケーションに存在するアプリケーション コードからデータベース オブジェクトの 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 データベース オブジェクトの作成
選択した SQL Server 2005 以降のデータベースで、最初の例に示されたコードを使用して、Currency テーブルと 2 つのストアド プロシージャを作成します。
Visual Studio で Transact-SQL エディターを開き、このデモに使用できるデータベースに接続します。詳細については、「方法: Transact-SQL エディターを起動する」および「方法: Transact-SQL エディターでデータベースに接続する」を参照してください。
最初の例から Transact-SQL コードをコピーして、Transact-SQL エディターに貼り付けます。
<database> を該当するデータベース名に置き換えてから、Transact-SQL エディターのツール バーにある [SQL の実行] をクリックします。
Transact-SQL エディターを SQL Server データベース プロジェクトまたはサーバー プロジェクトのコンテキストで開いた場合には、プロジェクトを閉じてから続行します。そうでない場合は、Transact-SQL エディターを開いたまま続行することができます。
多階層デバッグに備えたサーバー エクスプローラーの準備
使用するコンピューターで Transact-SQL デバッグ機能が有効であることを確認します。詳細については、「方法: Transact-SQL のデバッグを有効にする」を参照してください。
[表示] メニューの [サーバー エクスプローラー] をクリックして、サーバー エクスプローラーを開きます。
サーバー エクスプローラーで、データ接続を新規作成します。そのためには、[データ接続] を右クリックして [接続の追加] をクリックします。これにより、[接続の追加] ダイアログ ボックスが起動します。
Currency テーブルを作成したデータベースへの接続を作成します。接続に使用されるログインが、sysadmin 固定サーバー ロールのメンバーであることが重要です。詳細については、「方法: サーバー エクスプローラーを使用してデータベースに接続する」を参照してください。
データ接続の新規作成が完了したら、[データ接続] ノードでその接続を見つけます。
新しいデータ接続を右クリックして、[アプリケーションのデバッグ] をクリックします。これにより、接続で指定されたデータベースでの多階層デバッグが有効になります。
多階層デバッグに備えた C# コンソール アプリケーションの準備
サーバー エクスプローラーで準備した同じ Visual Studio インスタンスで、DeleteCurrencyDriver および DeleteCurrency ストアド プロシージャを実行する C# コンソール アプリケーションを準備します。
[ファイル] メニューの [新しいプロジェクト] をクリックして、新しい C# コンソール アプリケーションを開きます。
2 番目の例から C# コードをコピーして、プロジェクトによって作成された Program.cs ファイルのコードをすべて置き換えます。
コンソール アプリケーション プロパティで、[デバッグ] タブの [SQL Server デバッグを有効にする] をクリックします。これにより、コンソール アプリケーションで多階層デバッグが有効になります。詳細については、「方法: C++、Visual Basic、または C# のプロジェクトで Transact-SQL のデバッグを有効にする」を参照してください。
多階層コンソール アプリケーションのデバッグ
C# コード (Program.cs ファイル) で、ストアド プロシージャの各呼び出しの前後にブレークポイントを配置します。
ストアド プロシージャにブレークポイントを配置します。メモ: C# コードから Transact-SQL コードにステップ インすることはできませんが、SQL Server データベース オブジェクト間を移動することはできます。
サーバー エクスプローラーで、新しいデータ接続の下で新しいストアド プロシージャを見つけます。
[DeleteCurrency] ストアド プロシージャを右クリックして、[開く] をクリックします。これにより、Transact-SQL エディター ウィンドウが起動して、DeleteCurrency ストアド プロシージャが表示されます。SET NOCOUNT ON 行にブレークポイントを設定します。そのためには、エディターの左側にある灰色のバー内をクリックします。
[DeleteCurrencyDriver] ストアド プロシージャを右クリックして、[開く] をクリックします。これにより、Transact-SQL エディター ウィンドウが起動して、DeleteCurrencyDriver ストアド プロシージャが表示されます。SET NOCOUNT ON 行にブレークポイントを設定します。そのためには、エディターの左側にある灰色のバー内をクリックします。
F5 キーを押してアプリケーションを実行します。
さまざまなモジュール間をステップ実行します。
ブレークポイントをいくつか削除して、さまざまな層間および言語間での移動が及ぼす影響を確認します。
デバッグを終了するため、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 のデバッグを有効にする