WCF 서비스 모델을 사용하여 SQL에서 작업 삽입, 업데이트, 삭제 또는 선택
SQL Server 위한 Microsoft BizTalk 어댑터는 SQL Server 데이터베이스 테이블 및 뷰에서 기본 삽입, 선택, 업데이트 및 삭제 작업 집합을 검색합니다. 이러한 작업을 사용하면 대상 테이블 또는 뷰에서 Where 절로 한정된 간단한 SQL 삽입, 선택, 업데이트 및 삭제 문을 수행할 수 있습니다. 이 항목에서는 WCF 서비스 모델을 사용하여 이러한 작업을 수행하는 방법에 대한 지침을 제공합니다.
어댑터가 이러한 작업을 지원하는 방법에 대한 자세한 내용은 SQL 어댑터를 사용하여 테이블 및 뷰에서 작업 삽입, 업데이트, 삭제 및 선택을 참조하세요.
참고
사용자 정의 형식의 열이 있는 테이블에서 작업을 수행하는 경우 애플리케이션 개발을 시작하기 전에 SQL 어댑터를 사용하여 User-Defined 형식이 있는 테이블 및 뷰에서 작업을 참조해야 합니다.
이 항목에 사용된 예제 정보
이 항목의 예제에서는 Employee 테이블에서 작업을 수행합니다. Employee 테이블은 샘플과 함께 제공되는 SQL 스크립트를 실행하여 만듭니다. 샘플에 대한 자세한 내용은 어댑터 샘플을 참조하세요. 이 항목을 기반으로 하는 샘플 EmployeeBasicOps도 SQL 어댑터 샘플과 함께 제공됩니다.
WCF 클라이언트 클래스
SQL 어댑터가 검색하는 기본 SQL 작업에 대해 생성된 WCF 클라이언트의 이름은 다음 표에 나열된 대로 테이블 또는 뷰의 이름을 기반으로 합니다.
데이터베이스 아티팩트 SQL Server | WCF 클라이언트 이름 |
---|---|
테이블 | TableOp_[스키마]_[TABLE_NAME]클라이언트 |
보기 | ViewOp_[스키마]_[VIEW_NAME]클라이언트 |
[SCHEMA] = SQL Server 아티팩트 컬렉션(예: dbo).
[TABLE_NAME] = 테이블의 이름입니다. 예를 들어 Employee입니다.
[VIEW_NAME] = 보기의 이름입니다. 예를 들어 Employee_View.
테이블에서 작업을 호출하기 위한 메서드 서명
다음 표에서는 테이블의 기본 작업에 대한 메서드 서명을 보여 줍니다. 뷰 네임스페이스와 이름이 테이블의 네임스페이스를 대체한다는 점을 제외하고 보기의 서명은 동일합니다.
작업 | 메서드 시그니처 |
---|---|
삽입 | long[] Insert([TABLE_NS].[ TABLE_NAME][] 행); |
선택 | [TABLE_NS]. [TABLE_NAME] [] Select(string COLUMNS, string QUERY); |
업데이트 | int Update([TABLE_NS].[ TABLE_NAME]. RowPair[] 행); |
삭제 | int Delete([TABLE_NS].[ TABLE_NAME][] 행); |
[TABLE_NS] = 테이블 네임스페이스의 이름입니다. 예를 들어 schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee입니다.
[TABLE_NAME] = 테이블의 이름입니다. 예를 들어 Employee입니다.
예를 들어 다음 코드는 기본 "dbo" 스키마 아래 Employee 테이블의 삭제, 삽입, 선택 및 업데이트 작업에 대해 생성된 WCF 클라이언트 클래스에 대한 메서드 서명을 보여 줍니다.
public partial class TableOp_dbo_EmployeeClient : System.ServiceModel.ClientBase<TableOp_dbo_Employee>, TableOp_dbo_Employee {
public int Delete(schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] Rows);
public long[] Insert(schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] Rows);
public schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] Select(string Columns, string Query);
public int Update(schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair[] Rows);
}
이 코드 조각에서 TableOp_dbo_EmployeeClient 어댑터 서비스 참조 플러그 인 추가에서 생성된 SqlAdapterBindingClient.cs의 WCF 클래스 이름입니다.
테이블 작업에 대한 매개 변수
이 섹션에서는 각 테이블 작업에 필요한 매개 변수를 제공합니다.
삽입 작업
삽입 작업 유형 | 레코드 집합 |
---|---|
여러 레코드 | 테이블에 삽입해야 하는 INSERTRECORDS 컬렉션입니다. |
삽입 작업은 Long 데이터 형식의 배열을 반환하고 삽입된 행의 ID 값(있는 경우)을 저장합니다. 테이블에 ID 열이 없으면 반환 값은 NULL입니다.
작업 선택
COLUMN_NAMES | QUERY |
---|---|
대상에 있는 열 이름의 쉼표로 구분된 목록입니다. 예를 들어 "Employee_ID, 지정"입니다. 열 목록은 결과 집합에서 반환되어야 하는 대상의 열을 지정합니다. 열 목록에 지정되지 않은 열은 반환된 레코드 집합의 .NET 기본값으로 설정됩니다. nillable 열의 경우 이 값은 null입니다. | 쿼리의 대상 행을 지정하는 SQL WHERE 절의 내용입니다. 예를 들어 "지정 = '관리자'"입니다. 이 매개 변수를 null 로 설정하여 대상의 모든 행을 반환할 수 있습니다. |
Select 작업의 반환 값은 대상 테이블 또는 뷰에서 지정된 열과 행을 포함하는 강력한 형식의 결과 집합입니다.
업데이트 작업
쌍의 첫 번째 행 | 쌍의 두 번째 행 |
---|---|
레코드 쌍의 첫 번째 레코드는 업데이트해야 하는 새 값, 즉 UPDATE 문의 SET 절에 해당합니다. 를 사용하여 RowPair.After 설정할 수 있습니다. |
레코드 쌍의 두 번째 레코드는 행의 이전 값, 즉 UPDATE 문의 WHERE 절에 해당합니다. 를 사용하여 RowPair.Before 설정할 수 있습니다. |
업데이트 작업의 반환 값은 Int32 데이터 형식이며 업데이트된 행 수를 나타냅니다.
중요
업데이트해야 하는 레코드를 지정하는 동안 모든 값이 업데이트되지 않더라도 모든 열에 대한 값을 제공해야 합니다. 예를 들어 행에 열이 5개 있고 업데이트 작업이 RowPair.Before의 일부로 2개의 열만 업데이트하는 경우 5개의 열 값을 모두 전달해야 합니다. 그러나 RowPair.After의 경우 업데이트할 열만 지정할 수 있습니다.
삭제 작업
삭제 작업은 강력한 형식의 레코드 배열을 입력으로 사용합니다. 삭제 작업의 반환 값은 Int32 데이터 형식이며 삭제된 행 수를 나타냅니다.
테이블 및 뷰에서 작업을 호출하는 WCF 클라이언트 만들기
WCF 클라이언트를 사용하여 SQL Server 작업을 수행하는 데 필요한 제네릭 작업 집합에는 SQL 어댑터를 사용한 WCF 서비스 모델 개요에 설명된 작업 집합이 포함됩니다. 이 섹션에서는 테이블에서 기본 삽입, 선택, 업데이트, 삭제 작업을 호출하는 WCF 클라이언트를 만드는 방법을 설명합니다.
테이블에서 작업을 수행하는 WCF 클라이언트를 만들려면
Visual Studio에서 Visual C# 프로젝트를 만듭니다. 이 항목의 경우 콘솔 애플리케이션을 만듭니다.
Employee 테이블에서 삽입, 선택, 업데이트 및 삭제 작업에 대한 WCF 클라이언트 클래스를 생성합니다. WCF 클라이언트 클래스를 생성하는 방법에 대한 자세한 내용은 SQL Server 아티팩트용 WCF 클라이언트 또는 WCF 서비스 계약 생성을 참조하세요.
중요
WCF 클라이언트 클래스를 생성하기 전에 EnableBizTalkCompatibilityMode 바인딩 속성을 false로 설정해야 합니다.
솔루션 탐색기 및
Microsoft.ServiceModel.Channels
에 대한 참조를 추가합니다Microsoft.Adapters.Sql
.Program.cs 파일을 열고 아래 코드 조각에 설명된 대로 클라이언트를 만듭니다.
TableOp_dbo_EmployeeClient client = new TableOp_dbo_EmployeeClient("SqlAdapterBinding_TableOp_dbo_Employee"); client.ClientCredentials.UserName.UserName = "<Enter user name here>"; client.ClientCredentials.UserName.Password = "<Enter password here>";
이 코드 조각
TableOp_dbo_EmployeeClient
에서 은 SqlAdapterBindingClient.cs에 정의된 WCF 클라이언트입니다. 이 파일은 어댑터 서비스 참조 추가 플러그 인에 의해 생성됩니다.SqlAdapterBinding_TableOp_dbo_Employee
는 클라이언트 엔드포인트 구성의 이름이며 app.config 정의됩니다. 이 파일은 어댑터 서비스 참조 추가 플러그 인에서도 생성되며 바인딩 속성 및 기타 구성 설정을 포함합니다.참고
이 코드 조각에서는 구성 파일의 바인딩 및 엔드포인트 주소를 사용합니다. 코드에서 이러한 값을 명시적으로 지정할 수도 있습니다. 클라이언트 바인딩을 지정하는 다양한 방법에 대한 자세한 내용은 SQL 어댑터에 대한 클라이언트 바인딩 구성을 참조하세요.
아래 코드 조각에 설명된 대로 클라이언트를 엽니다.
try { Console.WriteLine("Opening Client..."); client.Open(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; }
Employee 테이블에서 삽입 작업을 호출합니다.
long[] recordsInserted; schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] insertRecord = new schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[1]; insertRecord[0] = new schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee(); insertRecord[0].Name = "John Smith"; insertRecord[0].Designation = "Manager"; insertRecord[0].Salary = 500000; try { Console.WriteLine("Inserting new table entry..."); recordsInserted = client.Insert(insertRecord); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; } Console.WriteLine("Record inserted"); Console.WriteLine("Press any key to continue ..."); Console.ReadLine();
위의 코드 조각을 바꿔 선택, 업데이트 또는 삭제 작업도 수행할 수 있습니다. 코드 조각을 추가하여 단일 애플리케이션에서 모든 작업을 수행할 수도 있습니다. 이러한 작업을 수행하는 방법에 대한 코드 조각의 경우
아래 코드 조각에 설명된 대로 클라이언트를 닫습니다.
client.Close(); Console.WriteLine("Press any key to exit..."); Console.ReadLine();
프로젝트를 빌드한 다음 실행합니다. 애플리케이션은 Employee 테이블에 레코드를 삽입합니다.
작업 선택
다음 코드는 Employee 테이블을 대상으로 하는 Select 작업을 보여 줍니다. 선택 작업은 테이블에 삽입된 마지막 레코드를 선택합니다. 반환된 레코드는 콘솔에 기록됩니다.
schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] selectRecords;
try
{
Console.WriteLine("Selecting Row...");
selectRecords = client.Select("*", "where [Employee_ID] = (select IDENT_CURRENT('Employee'))");
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
throw;
}
Console.WriteLine("The details of the newly added employee are:");
Console.WriteLine("********************************************");
for (int i = 0; i < selectRecords.Length; i++)
{
Console.WriteLine("Employee ID : " + selectRecords[i].Employee_ID);
Console.WriteLine("Employee Name : " + selectRecords[i].Name);
Console.WriteLine("Employee Desigation: " + selectRecords[i].Designation);
Console.WriteLine();
}
Console.WriteLine("********************************************");
Console.WriteLine("Press any key to continue ...");
Console.ReadLine();
업데이트 작업
다음 코드는 Employee 테이블을 대상으로 하는 업데이트 작업을 보여 줍니다.
int result;
schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair updateRecordPair =
new schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair();
schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee updateRecord =
new schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee();
schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair[] updateArray =
new schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair[1];
updateRecord = insertRecord[0];
updateRecord.Name = "Jeff Smith";
updateRecordPair.After = updateRecord;
updateRecordPair.Before = selectRecords[0];
updateArray[0] = updateRecordPair;
try
{
Console.WriteLine("Updating the database...");
result = client.Update(updateArray);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
throw;
}
Console.WriteLine("Updated Record for {0}", updateRecordPair.Before.Name);
Console.WriteLine("The new name for the employee is {0}", updateRecordPair.After.Name);
Console.WriteLine("Press any key to continue ...");
Console.ReadLine();
삭제 작업
다음 코드는 Employee 테이블을 대상으로 하는 삭제 작업을 보여 줍니다.
int deleteSuccess;
schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] deleteRecords =
new schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[1];
deleteRecords = client.Select("*", "where [Employee_ID] = (select IDENT_CURRENT('Employee'))");
Console.WriteLine("Following employees will be deleted from the database:");
for (int i = 0; i < deleteRecords.Length; i++)
{
Console.WriteLine("Name: {0}", deleteRecords[i].Name);
}
Console.WriteLine("Press any key to begin deletion...");
Console.ReadLine();
try
{
Console.WriteLine("Deleting employee record...");
deleteSuccess = client.Delete(deleteRecords);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
throw;
}