更新 : 2007 年 11 月
このトピックの内容は、次の製品に該当します。
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
![]() |
![]() |
![]() |
![]() |
Standard |
![]() |
![]() |
![]() |
![]() |
Pro/Team |
![]() |
![]() |
![]() |
![]() |
表の凡例 :
![]() |
対象 |
![]() |
該当なし |
![]() |
既定で非表示のコマンド |
ここでは、多階層アプリケーションのデバッグ方法を説明するサンプル コードを紹介します。また、クライアントまたは中間層アプリケーションに含まれるアプリケーション コードから、SQL Server 2005 内で実行されるデータベース オブジェクトのコードまでのデバッグに必要な手順についても説明します。
アプリケーション層とデータベース層間の移行では、対象となる層にブレークポイントを設定する必要があります。ブレークポイントがない場合、その層にステップ インするときに停止せずに、コードがそのまま実行されます。ただし、データベース層内にある T-SQL コードと SQL CLR コード間で移行する場合、各コードでのステップ実行を有効にするブレークポイントは必要ありません。
この例では AdventureWorks データベースを使用し、異なる階層や異なる言語間でのステップ実行を行います。この例は、移行について説明するためのもので、現実的なビジネス シナリオではありません。
ストアド プロシージャが 3 つ呼び出されます。
DeleteCurrency は、ある通貨コードを持つ通貨を削除する SQL CLR ストアド プロシージャです。
DeleteCurrency_T_SQL の実行内容も同じですが、T-SQL で記述されています。
DeleteCurrencyDriver は、削除する通貨コードを指定した入力パラメータを指定して、前の 2 つのストアド プロシージャを呼び出します。
アプリケーション コードで 3 つのすべてのストアド プロシージャが呼び出され、通貨コード パラメータで渡されます。"Driver 以外の" 2 つのストアド プロシージャは、2 つの異なるコンテキストで呼び出されます。DeleteCurrencyDriver から呼び出される場合とアプリケーションから直接呼び出される場合です。最初のコンテキストの場合は、DeleteCurrencyDriver から他の 2 つのストアド プロシージャにステップ インできます。アプリケーションから呼び出された場合は、ストアド プロシージャに直接ステップ インできないため、ストアド プロシージャ内にブレークポイントを設定する必要があります。
データベース アプリケーションのデバッグ
新しい SQL Server プロジェクトで、AdventureWorks データベースとの接続を確立します。詳細については、「方法 : データベースに接続する」を参照してください。
後述する最初のサンプルにあるコードを使用して、T-SQL ストアド プロシージャを作成し、DeleteCurrency_T_SQL と名前を付けます。名前付けや他の手順の詳細については、「方法 : SQL Server のプロジェクトの種類を使用して開発する」を参照してください。
後述する 2 つ目のサンプルにあるコードを使用して、SQL CLR ストアド プロシージャを作成し、DeleteCurrency.cs と名前を付けます。
後述する 3 つ目のサンプルにあるコードを使用して、SQL CLR ストアド プロシージャを作成し、DeleteCurrencyDriver と名前を付けます。
[デバッグ] メニューの [開始] をクリックして、AdventureWorks データベースへのこれらの変更をコンパイルし、配置します。
各ストアド プロシージャに 1 つ以上のブレークポイントを設定します。ネイティブ コードまたはマネージ コードからストアド プロシージャにステップ インしても、機能しません。
新しいコンソール プロジェクトを Visual Studio に作成します。
4 つ目のサンプル コードをテキスト エディタに貼り付けます。
個々のストアド プロシージャ呼び出しの前後にブレークポイントを設定します。
F5 キーを押してアプリケーションを実行します。
さまざまなモジュールでステップ実行します。
ブレークポイントの一部を削除しようとすると、異なる階層や言語間でステップ実行しようとした場合の影響がわかります。
デバッグを終了する場合、Visual Studio の [デバッグ] メニューを使用してブレークポイントをすべて解除し、F5 キーを押します。
使用例
ここには、T-SQL ストアド プロシージャのコードが含まれます。
CREATE PROCEDURE dbo.DeleteCurrency_T_SQL
(
@CurrencyCode nvarchar(3)
)
AS
SET NOCOUNT ON
DELETE Sales.Currency
WHERE CurrencyCode = @currencyCode
RETURN
ここには、ドライバ ストアド プロシージャから呼び出される SQL CLR ストアド プロシージャのコードが含まれます。
using System;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[SqlProcedure]
public static void DeleteCurrency(SqlString currencyCode)
{
string sCmd = "DELETE Sales.Currency WHERE CurrencyCode = '" + currencyCode.Value + "'";
SqlConnection conn = new SqlConnection("Context Connection=True");
conn.Open();
SqlCommand DeleteCurrencyCommand = new SqlCommand( sCmd , conn);
DeleteCurrencyCommand.ExecuteNonQuery();
}
}
ここには、他のプロシージャを呼び出す SQL CLR ドライバ プロシージャのコードが含まれます。ストアド プロシージャは、アプリケーション層から呼び出されます。
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[SqlProcedure]
public static void DeleteCurrencyDriver(SqlString CurrencyCode)
{
string sCommand = "DELETE Sales.Currency WHERE CurrencyCode = '" + CurrencyCode.Value + "'";
SqlConnection conn = new SqlConnection("Context Connection=True");
conn.Open();
SqlCommand DeleteCurrencyCommand = new SqlCommand(sCommand, conn);
DeleteCurrencyCommand.ExecuteNonQuery();
// Now execute a T-SQL stored procedure.
DeleteCurrencyCommand.CommandType = CommandType.StoredProcedure;
DeleteCurrencyCommand.CommandText = "DeleteCurrency_T_SQL";
// Fill the parameters collection based upon stored procedure.
SqlParameter workParam = null;
workParam = DeleteCurrencyCommand.Parameters.Add("@CurrencyCode", SqlDbType.NChar, 3);
DeleteCurrencyCommand.Parameters["@CurrencyCode"].Value = "ESC";
try { DeleteCurrencyCommand.ExecuteNonQuery(); }
catch { }
// Now execute a CLR stored procedure.
DeleteCurrencyCommand.CommandText = "DeleteCurrency";
try { DeleteCurrencyCommand.ExecuteNonQuery(); }
catch { }
}
};
ここには、T-SQL ストアド プロシージャと SQL CLR ストアド プロシージャを直接呼び出すだけでなく、ドライバ ストアド プロシージャを呼び出すアプリケーション コードも含まれます。
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, 3);
procCommand.Parameters["@CurrencyCode"].Value = "ESC";
try { procCommand.ExecuteNonQuery(); }
catch (SqlException e) { DumpException(e); }
procCommand.CommandText = "DeleteCurrency";
try { procCommand.ExecuteNonQuery(); }
catch (SqlException e) { DumpException(e); }
procCommand.CommandText = "DeleteCurrency_T_SQL";
try { procCommand.ExecuteNonQuery(); }
catch (SqlException e) { DumpException(e); }
SqlConnection1.Close();
}
static void DumpException(SqlException e)
{
string errorMessages = "";
for (int i = 0; i < e.Errors.Count; i++)
{
errorMessages += "Index #" + i + "\n" +
"Message: " + e.Errors[i].Message + "\n" +
"LineNumber: " + e.Errors[i].LineNumber + "\n" +
"Source: " + e.Errors[i].Source + "\n" +
"Procedure: " + e.Errors[i].Procedure + "\n";
}
System.Diagnostics.EventLog log = new System.Diagnostics.EventLog();
log.Source = "My Application";
log.WriteEntry(errorMessages);
Console.WriteLine("An exception occurred. Please contact your system administrator.");
}
}
}