방법: 다중 계층 데이터베이스 응용 프로그램 디버깅

업데이트: 2007년 11월

이 항목은 다음 언어에 적용됩니다.

Edition

Visual Basic

C#

C++

Web Developer

Express

항목이 적용되지 않음 항목이 적용되지 않음 항목이 적용되지 않음 항목이 적용되지 않음

Standard

항목이 적용되지 않음 항목이 적용되지 않음 항목이 적용되지 않음 항목이 적용되지 않음

Pro 및 Team

항목이 적용됨 항목이 적용됨 항목이 적용됨 항목이 적용됨

표의 범례:

항목이 적용됨

해당

항목이 적용되지 않음

해당 없음

항목이 적용되지만 명령은 기본적으로 숨겨짐

명령은 기본적으로 숨겨져 있습니다.

이 항목에서는 다중 계층 응용 프로그램의 디버깅 방법을 보여 주는 샘플 코드를 제공하고, 디버깅 중 클라이언트 또는 다중 계층 응용 프로그램에 상주하는 응용 프로그램 코드로부터 SQL Server 2005 내에서 실행되는 데이터베이스 개체의 코드로 전환하는 데 필요한 단계를 설명합니다.

응용 프로그램 계층과 데이터베이스 계층 간에 전환하려면 대상 계층에 중단점이 있어야 합니다. 그렇지 않으면 대상 계층의 코드는 한 단계씩 실행할 때 중단되지 않고 단순히 실행만 됩니다. 그러나 데이터베이스 계층 내에서 T-SQL 코드와 SQL CLR 코드 간에 전환하여 한 단계씩 실행하는 데는 중단점이 필요하지 않습니다.

AdventureWorks 데이터베이스를 사용하는 다음 예제에서는 다른 계층과 언어 간에 전환하며 한 단계씩 코드를 실행합니다. 이 예제는 단순히 이러한 전환을 보여 주는 것이 목적이며 실제 비즈니스 시나리오는 아닙니다.

다음과 같은 세 개의 저장 프로시저가 호출됩니다.

  • DeleteCurrency는 지정된 통화 코드를 갖는 통화를 삭제하는 SQL CLR 저장 프로시저입니다.

  • DeleteCurrency_T_SQL은 동일한 작업을 수행하지만 T-SQL로 작성되었습니다.

  • DeleteCurrencyDriver는 삭제할 통화 코드를 지정하는 입력 매개 변수를 사용하여 위의 두 저장 프로시저를 호출합니다.

응용 프로그램 코드에서는 통화 코드 매개 변수를 전달하여 이 세 개의 저장 프로시저를 모두 호출합니다. 두 개의 "비드라이버" 저장 프로시저가 서로 다른 두 컨텍스트인 DeleteCurrencyDriver와 응용 프로그램에서 호출됩니다. 응용 프로그램의 경우 프로시저가 직접 호출됩니다. 첫 번째 컨텍스트의 경우 DeleteCurrencyDriver에서 다른 두 저장 프로시저로 진행할 수 있습니다. 응용 프로그램에서 호출하는 경우에는 이를 직접 단계별로 실행할 수 없으며 저장 프로시저 안에 중단점을 설정해야 합니다.

데이터베이스 응용 프로그램 디버깅

  1. 새 SQL Server 프로젝트에서 AdventureWorks 데이터베이스에 대한 연결을 설정합니다. 자세한 내용은 방법: 데이터베이스에 연결을 참조하십시오.

  2. 아래의 첫 번째 예제 섹션에 있는 코드를 사용하여 T-SQL 저장 프로시저를 만들고 이름을 DeleteCurrency_T_SQL로 지정합니다. 이에 대한 자세한 내용이나 이 절차의 단계에 대한 자세한 내용은 방법: SQL Server 프로젝트 형식으로 개발을 참조하십시오.

  3. 아래의 두 번째 예제 섹션에 있는 코드를 사용하여 SQL CLR 저장 프로시저를 만들고 이름을 DeleteCurrency.cs로 지정합니다.

  4. 아래의 세 번째 예제 섹션에 있는 코드를 사용하여 SQL CLR 저장 프로시저를 만들고 이름을 DeleteCurrencyDriver로 지정합니다.

  5. 디버그 메뉴에서 시작을 클릭하여 AdventureWorks 데이터베이스에 대한 이러한 변경 사항을 컴파일하고 배포합니다.

  6. 각 저장 프로시저에 하나 이상의 중단점을 설정합니다. 네이티브 코드나 관리 코드에서 저장 프로시저로 전환하여 한 단계씩 실행할 수는 없습니다.

  7. Visual Studio에서 새 콘솔 프로젝트를 만듭니다.

  8. 네 번째 예제에 있는 코드를 텍스트 편집기에 붙여넣습니다.

  9. 각 저장 프로시저 호출의 앞뒤에 중단점을 삽입합니다.

  10. F5 키를 눌러 응용 프로그램을 실행합니다.

  11. 다른 모듈을 단계별로 실행합니다.

  12. 일부 중단점을 제거해 보고 다른 계층 및 언어 간에 전환하여 한 단계씩 실행하는 결과를 확인합니다.

  13. 디버깅을 마치려면 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.");
        }
    }
}

참고 항목

작업

방법: 프로젝트에 SQL 디버깅 사용

방법: 다중 계층 디버깅 사용

방법: 연결에 CLR 디버깅 사용

방법: SQL Server 2005 디버깅 사용