C# 구성 요소에서 COM + 트랜잭션을 사용 하는 방법

이 문서의 Microsoft Visual Basic.NET 버전 315707 를 참조 하십시오.

이 작업에서는

요약

이 문서에는 C# 클래스에서 COM + (구성 요소 서비스) 트랜잭션을 사용 하는 방법을 설명 합니다. 데이터베이스 작업의 집합은 하나의 단위로 간주 됩니다. 일부 작업을 수행 하거나, 한 번 실패 하면 전체 트랜잭션이 실패 합니다. 후자의 경우 시도 된 모든 데이터베이스 작업은 내부 데이터베이스에 게시 되지 않습니다.


맨 위로

요구 사항

다음 항목은 권장 되는 하드웨어, 소프트웨어, 네트워크 인프라, 기술과 지식 및 필요한 서비스 팩 설명입니다.
  • Microsoft Windows 2000 Server s p 1
  • Microsoft 인터넷 정보 서비스 (IIS) 버전 4.0 이상
  • Microsoft Internet Explorer 버전 5.0, 5.5 또는 6.0
이 문서는 다음에 익숙한 가정 합니다.
  • 트랜잭션 개념 및 처리
  • COM + (구성 요소 서비스)
맨 위로

COM + 트랜잭션 서비스

트랜잭션 처리의 Microsoft.NET Framework System.EnterpriseServices 네임 스페이스를 사용 하 여 구현할 수 있습니다. COM + 트랜잭션 서비스에 액세스 하려면 클래스를 만듭니다. 이렇게 하려면, 다음 단계를 수행하십시오.
  1. Visual Studio.NET 또는 Visual Studio 2005를 시작 합니다.
  2. 파일 메뉴에서 가리킨
    새로만들기를 누른 다음 프로젝트를 클릭 합니다.
  3. C# 프로젝트 를 클릭 합니다.
    프로젝트 형식, 누른 다음 템플릿에서 클래스 라이브러리를 클릭 하 고 있습니다. 프로젝트 이름
    prjEnterprise.

    참고: Visual Studio 2005에서를 클릭 C# 아래에서
    프로젝트 형식, 누른 다음 템플릿에서 클래스 라이브러리를 클릭 하 고 있습니다. 프로젝트 이름
    prjEnterprise.
  4. 기본적으로 Class1 만들어집니다.
  5. 솔루션 탐색기에서 마우스 오른쪽 단추로 클릭
    참조, 다음 참조 추가클릭 하 고 있습니다.
  6. 참조 추가 대화 상자가 나타납니다. .NET 탭의 구성 요소 이름 아래에서 System.EnterpriseServices를 두 번 클릭 합니다.
  7. System.EnterpriseServices 선택한 구성 요소아래에 표시 되는지 확인 하십시오. 확인을 클릭합니다.
  8. Class1.cs 파일의 다른 문 앞에 다음 코드를 추가할:
    using System.EnterpriseServices;using System.Data.SqlClient;
  9. Class1.cs 파일을 위해 clsES 라는 새 클래스를 추가 합니다.
  10. COM + 트랜잭션 서비스를 사용 하려면 클래스 (위해 clsES) 해야 기능 ServicedComponent에서 상속 다음과 같습니다.
    public class clsES : ServicedComponent
  11. 트랜잭션 특성 클래스에 대 한 트랜잭션 지원 수준을 다음과 같이 지정 하는 데 사용 됩니다.
    [Transaction(TransactionOption.Required)]public class clsES : ServicedComponent
  12. 위해 clsES 클래스에 메서드를 만들고 이름을 dbAccess 네 개의 정수 입력된 매개 변수를 받습니다. 처음 두 매개 변수는 제품 ID와 단위를 주문 제품에 대 한 제공합니다. 다음 두 매개 변수는 해당 제품에 대 한 제품 ID 및 재고 단위를 제공합니다. 이 메서드는 이러한 지정한 제품 Id 트랜잭션으로 처리에 대해 데이터베이스 작업 집합을 수행 합니다.
    void dbAccess(int pID1,int onOrder, int pID2, int inStock)
  13. DbAccess 메서드에서 Northwind 데이터베이스에 대해 SQL 연결 개체 작성 하 고 연결을 엽니다. 데이터베이스 작업이 데이터베이스를 사용 하 여 수행 됩니다.

    참고: SQL Server 서버에 대 한 올바른 값을 반영 하기 위해 다음과 같은 연결 문자열 매개 변수를 변경 해야 합니다.
    SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");Conn.Open();

  14. 데이터베이스 처리 중 발생할 수 있는 예외를 알리도록 try 블록을 설정 합니다. 트랜잭션을 중단 하기 위해서는 이러한 예외를 catch 해야 합니다. Try 블록에는 두 가지 데이터베이스 작업이 포함 됩니다. 각 작업은 지정 된 제품 테이블 레코드에서 서로 다른 필드를 업데이트합니다.
     try { 
  15. 제품 테이블을 첫 번째 업데이트를 수행 합니다. UnitsonOrder 필드 처음 두 개의 입력된 매개 변수에서 지정 된 ID 사용 하 여 제품의 onOrder 값으로 업데이트 합니다. 다음 SQL 명령을 사용 하 여이 SQL 업데이트를 실행 하려면:
    SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);sqlCommand.ExecuteNonQuery();
  16. 제품 테이블을 다른 업데이트를 수행 합니다. UnitsinStock 필드와 업데이트 된 차량 세 번째와 네 번째 입력된 매개 변수에서 지정 된 ID 사용 하 여 제품에 대 한 값입니다. 다음 SQL 명령을 사용 하 여이 SQL 업데이트를 실행 하려면:
    sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;sqlCommand.ExecuteNonQuery();

  17. 이러한 업데이트가 COM + 트랜잭션 부분이 기 때문에 한 단위로 적용 되기. 트랜잭션 커밋 System.EnterpriseServices 네임 스페이스의 contextUtil 클래스에서 setComplete 메서드를 사용 하는 (이 경우 두 업데이트) 오류가 throw 된 경우:
    ContextUtil.SetComplete();
  18. Northwind 데이터베이스에 대 한 연결이 닫힙니다.
    Conn.Close();}
  19. 전체 트랜잭션을 중단할 수 있도록 SQL 명령을 실행 하는 동안 발생 하는 모든 예외를 catch 해야 합니다.
    catch(Exception e){ 
  20. System.EnterpriseServices 네임 스페이스의 contextUtil 클래스의 setAbort 메서드 전체 트랜잭션을 중단 하는 데 사용 됩니다. 첫 번째 업데이트가 성공 하 고 두 번째 업데이트가 실패 한 경우 두 업데이트 제품 테이블에 게시 됩니다. 알려진된 예외는 트랜잭션이 실패 하 고 호출자에 게 throw 됩니다.
    ContextUtil.SetAbort();throw e;
    }
  21. 제대로 작동 하려면이 구성 요소에 대 한 구성 요소에 강력한 이름이 있어야 합니다. 강력한 이름을 생성 한 다음 강력한 이름으로 어셈블리에 서명 합니다. 이렇게 하려면, 다음 단계를 수행하십시오.
    1. Visual Studio.NET 명령 프롬프트 입력
      sn.exe-k snEnterprise.snk 키 파일을 만듭니다. 강력한 이름으로 어셈블리를 서명 하는 방법에 대 한 자세한 내용은.NET Framework SDK 설명서를 참조 하십시오.
    2. SnEnterprise.snk 프로젝트 폴더에 복사 합니다.
    3. AssemblyInfo.vc, 이전 또는 이후에 다른 어셈블리 특성 문은 코드의 다음 줄 추가:
      [assembly: AssemblyKeyFileAttribute("..\\..\\snEnterprise.snk")]
    4. 저장 한 다음 프로젝트를 빌드하십시오.
맨 위로

전체 코드 목록

참고: SQL Server 서버에 대 한 올바른 값을 반영 하기 위해 다음과 같은 연결 문자열 매개 변수를 변경 해야 합니다.
using System;using System.Data;
using System.Data.SqlTypes;
using System.Data.Common;
using System.EnterpriseServices;
using System.Data.SqlClient;

namespace prjEnterprise
{

[Transaction(TransactionOption.Required)]public class clsES:ServicedComponent
{
public SqlConnection Conn;

public void dbAccess(int pID1, int onOrder, int pID2, int inStock)
{
try
{
SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
Conn.Open();

SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
sqlCommand.ExecuteNonQuery();

sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
sqlCommand.ExecuteNonQuery();

ContextUtil.SetComplete();
Conn.Close();
}
catch(Exception e)
{
ContextUtil.SetAbort();

throw e;
}
finally
{

}
}
}
}

맨 위로

작동 하는지 확인

이 코드를 테스트 하기 위해 clsES 프로젝트를 사용 하는 콘솔 응용 프로그램을 만듭니다. 한 경우, 트랜잭션이 성공 onorder 및 및 instock 지정된 된 제품에 대 한 필드가 업데이트 됩니다. 두 번째 경우에는 지정 된 제품의 onOrder 필드에 대 한 업데이트 성공 하지만 업데이트에 대 한의 inStock 지정 된 제품 번호가 제품 테이블에 없기 때문에 오류가 발생 하는 제품에 대 한 필드. 이 인해 트랜잭션이 실패 하 고 무시 됩니다.
  1. Visual Studio.NET 또는 Visual Studio 2005에서 새로 만들기 를 가리킨에
    파일 메뉴를 누른 다음 프로젝트를 클릭 합니다.
  2. C# 프로젝트 를 클릭 합니다.
    프로젝트 형식, 누른 다음 템플릿에서 콘솔 응용 프로그램 을.

    참고: Visual Studio 2005에서를 클릭 C# 아래에서
    프로젝트 형식, 누른 다음 템플릿에서 콘솔 응용 프로그램 을.
  3. 이름 텍스트 상자에 입력
    testES합니다. 솔루션에 추가 옵션이 선택 되어 있는지 확인 하십시오.
  4. 이 프로젝트를 솔루션에 추가 하려면 확인 을 클릭 합니다.
  5. TestES위해 clsES테스트에 대 한 참조를 추가 해야 합니다. 솔루션 탐색기에서 마우스 오른쪽 단추로 클릭
    (새로 추가한) testES 에서 참조 를 클릭 하 고 참조 추가클릭 합니다.
  6. 참조 추가 대화 상자가 나타납니다. 프로젝트 탭에서 두 번 클릭
    prjEnterprise.
  7. 선택한 구성 요소에 참조가 나타납니다. 프로젝트에이 참조를 추가 하려면 확인 클릭 합니다.
  8. System.EnterpriseServices 라이브러리 프로젝트에 대 한 참조를 추가 합니다. 솔루션 탐색기에서 마우스 오른쪽 단추로 클릭
    참조, 다음 참조 추가 클릭 하 고
    .
  9. 참조 추가 대화 상자가 나타납니다. .NET 탭의 구성 요소 이름 아래에서 System.EnterpriseServices를 두 번 클릭 합니다.
  10. System.EnterpriseServices 선택한 구성 요소아래에 표시 되는지 확인 하십시오. 확인을 클릭합니다.
  11. 콘솔 응용 프로그램 (testES)을 마우스 오른쪽 누른 다음 시작 프로젝트로 설정 합니다.
  12. Class1 클래스의 Main 함수에 다음 소스 코드를 붙여 넣습니다.
    prjEnterprise.clsES myTest = new prjEnterprise.clsES();
    try
    {
    myTest.dbAccess(1, 777, 2, 888);
    Console.WriteLine("TRANSACTION ONE -- SUCCESS");

    myTest.dbAccess(1, 5, 2, -20);
    Console.WriteLine("TRANSACTION TWO -- SUCCESS");
    }
    catch (Exception e)
    {
    Console.WriteLine("TRANSACTION FAILURE");
    }
  13. F5 키를 눌러 테스트 코드를 실행 합니다.

    7 단계에서 코드에서 첫 번째 dbaccess 호출 성공합니다. 제품 1 및 2 제품 제품 테이블에는. 777 제품 1의 onOrder 필드가 업데이트 되어 있고 inStock 필드 제품 2 888으로 업데이트 됩니다. 출력 창에 다음과 같은 메시지가 나타나면이 트랜잭션이 성공 하기 때문에
    트랜잭션-한 성공


    두 번째 dbAccess 호출은 실패합니다. 따라서 제품 테이블에 dbAccess update 문은 두 데이터베이스에 게시 됩니다. 제품 1 5로 업데이트 된 onOrder 필드에 있을 수 있습니다, 있지만 제품 2를 사용할 수 없습니다의 inStock 필드 -20으로 설정 합니다. 제품 테이블 정의에 정의 되어 있는 제약 조건 때문에 inStock 음수 가질 수 없습니다.

    따라서 dbaccess 이 호출에 실패 하 고 전체 트랜잭션이 실패 합니다. Products 테이블 dbaccess호출 이전의 상태로 유지 됩니다. Catch 문을 dbAccess트랜잭션 실패 알림을 처리 하 고 출력 창에 다음과 같은 오류 메시지가 나타납니다.
    트랜잭션 실패
  14. SQL Server 엔터프라이즈 관리자를 사용 하 여 Northwind Products 테이블의 내용을 검사 합니다. 1 제품을 보면 onOrder 필드 777 같습니다. 보면 제품 2의 instock 필드는 888. 따라서 두 번째 dbAccess (결과는 해당이 필드에 서로 다른 값)는 호출에 실패 합니다.
맨 위로

문제 해결

  • COM + 서비스를 사용 하는 프로젝트에 강력한 이름이 있는지 확인 하십시오.
  • COM + 서비스를 사용 하는 모든 클래스는 서비스 대상된 구성 요소에서 상속 해야 합니다. 서비스 구성 요소는 System.EnterpriseServices 네임 스페이스에 있습니다.
  • 디버깅 하는 동안 트랜잭션이 있습니다 전에 시간이 초과 커밋 또는 중단 합니다. 시간 초과 방지 하려면 트랜잭션 특성에서 제한 시간 속성을 사용 합니다. 다음 예제에서는 연결된 된 메서드의 트랜잭션 완료 제한 시간과 1, 200 초는
    [Transaction(TransactionOption.Required,timeout=1200)]
맨 위로

참조

자세한 내용은 다음 Microsoft Developer Network (MSDN) 웹 사이트를 방문 하십시오.
COM + 통합:.NET 엔터프라이즈 서비스를 통해 방법 빌드 분산 응용 프로그램
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/default.aspx
맨 위로
속성

문서 ID: 816141 - 마지막 검토: 2017. 2. 7. - 수정: 2

피드백