방법: 다중 계층 데이터베이스 응용 프로그램 디버깅
이 항목은 다음 제품에 적용됩니다.
Visual Studio Ultimate |
Visual Studio Premium |
Visual Studio Professional |
Visual Studio Express |
---|---|---|---|
이 항목에는 다중 계층 데이터베이스 응용 프로그램의 디버깅을 보여 주는 샘플 코드가 들어 있으며, 클라이언트 또는 중간 계층 응용 프로그램에 있는 응용 프로그램 코드에서 SQL Server 2005 이상 버전의 SQL Server 인스턴스 내에서 실행되는 데이터베이스 개체의 Transact-SQL 코드를 디버깅하는 데 필요한 단계를 설명합니다.
응용 프로그램 계층과 데이터베이스 계층을 전환하려면 대상 계층에 중단점이 있어야 합니다. 그렇지 않으면 계층의 코드를 한 단계씩 실행하려고 할 때 코드가 중지하지 않고 실행됩니다.그러나 데이터베이스 계층 내에서 Transact-SQL 및 SQL CLR 코드를 전환하는 경우에는 중단점이 없어도 두 코드를 전환하여 코드를 한 단계씩 실행할 수 있습니다.
다음 예제에서는 C# 콘솔 응용 프로그램, Currency라는 SQL Server 데이터베이스 테이블 및 저장 프로시저 두 개를 통해 C#과 Transact-SQL을 임의 방향으로 전환하여 코드를 한 단계씩 실행합니다.이 예제는 이러한 전환을 보여 주기 위한 것이며 실제 비즈니스 시나리오는 아닙니다.
저장 프로시저 두 개가 호출됩니다.
DeleteCurrency는 지정된 통화 코드를 가진 통화를 삭제하는 Transact-SQL 저장 프로시저입니다.
DeleteCurrencyDriver도 Transact-SQL 저장 프로시저입니다.이 저장 프로시저는 삭제할 통화 코드를 지정하는 입력 매개 변수를 사용하여 위의 저장 프로시저를 호출합니다.
응용 프로그램 코드에서 두 저장 프로시저를 모두 호출하고 통화 코드 매개 변수를 전달합니다."드라이버가 아닌" 저장 프로시저는 서로 다른 두 컨텍스트, 즉 DeleteCurrencyDriver와 응용 프로그램에서 직접 호출됩니다.첫 번째 컨텍스트에서는 한 단계씩 코드 실행 단추를 클릭하면 DeleteCurrencyDriver에서 다른 저장 프로시저로 전환하여 코드를 한 단계씩 실행할 수 있습니다.응용 프로그램에서 호출되는 경우 저장 프로시저의 코드를 직접 한 단계씩 실행할 수는 없으며 저장 프로시저 내에 중단점을 설정해야 합니다.
이 데모에 사용할 Transact-SQL 데이터베이스 개체 만들기
선택한 SQL Server 2005 이상 데이터베이스에서 첫 번째 예제의 코드를 사용하여 Currency 테이블과 저장 프로시저 두 개를 만듭니다.
Visual Studio에서 Transact-SQL 편집기를 열고 이 데모에 사용할 수 있는 데이터베이스에 연결합니다.자세한 내용은 방법: Transact-SQL 편집기 시작 및 방법: Transact-SQL 편집기에서 데이터베이스에 연결을 참조하십시오.
첫 번째 예제의 Transact-SQL 코드를 복사하여 Transact-SQL 편집기에 붙여 넣습니다.
<database>를 해당 데이터베이스 이름으로 바꾸고 Transact-SQL 편집기 도구 모음에서 SQL 실행을 클릭합니다.
SQL Server 데이터베이스 또는 서버 프로젝트의 컨텍스트에서 Transact-SQL 편집기를 연 경우 계속하기 전에 프로젝트를 닫습니다.그렇지 않으면 Transact-SQL 편집기를 열어 두고 계속할 수 있습니다.
서버 탐색기에서 다중 계층 디버깅 준비
컴퓨터에 Transact-SQL 디버깅을 사용하도록 설정했는지 확인합니다.자세한 내용은 방법: Transact-SQL 디버깅 사용을 참조하십시오.
보기 메뉴를 열고 서버 탐색기를 클릭하여 서버 탐색기를 엽니다.
서버 탐색기에서 데이터연결을 마우스 오른쪽 단추로 클릭하고 연결 추가를 선택하여 새 데이터 연결을 만듭니다.연결 추가 대화 상자가 시작됩니다.
Currency 테이블을 만든 데이터베이스에 대한 연결을 만듭니다.연결에 사용되는 로그인이 sysadmin 고정 서버 역할의 멤버여야 합니다.자세한 내용은 방법: 서버 탐색기를 사용하여 데이터베이스에 연결을 참조하십시오.
새 데이터 연결을 만든 후 데이터 연결 노드에서 찾습니다.
새 데이터 연결을 마우스 오른쪽 단추로 클릭하고 응용 프로그램 디버깅을 클릭합니다.이렇게 하면 연결에 지정된 데이터베이스에서 다중 계층 디버깅을 사용할 수 있습니다.
C# 콘솔 응용 프로그램에서 다중 계층 디버깅 준비
서버 탐색기를 준비한 Visual Studio 인스턴스와 동일한 인스턴스에서 DeleteCurrencyDriver 및 DeleteCurrency 저장 프로시저를 실행할 C# 콘솔 응용 프로그램을 준비합니다.
파일 메뉴를 열고 새 프로젝트를 클릭하여 새 C# 콘솔 응용 프로그램을 엽니다.
두 번째 예제의 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 테이블과 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();
}
}
}