문제

거래를 지원하지 않거나 중첩 거래를 지원하지 않는 제공자를 사용하여 실행할 수있는 코드가 있습니다.

그러한 지원을 프로그래밍 방식으로 어떻게 결정합니까?

예를 들어 아래 코드는 MySQL .NET 커넥터를 사용할 때 최종 커밋에 대한 System.InValidOperationException을 던지지 만 MSSQL에서는 잘 작동합니다.

공급자 유형을 기반으로 하드 코드 테스트없이 다양한 공급 업체를 수용 할 수 있도록 코드를 변경할 수 있기를 원합니다 (예 :해야 할 필요가 없습니다. if(typeof(connection) == "some provider name"))

using (IDbConnection connection = Use.Connection(ConnectionStringName))
using (IDbTransaction transaction = connection.BeginTransaction())
{
  using (currentCommand = connection.CreateCommand())
  {
    using (IDbCommand cmd = connection.CreateCommand())
    {
      currentCommand = cmd;
      currentCommand.Transaction = transaction;
      currentCommand.ExecuteNonQuery();
    }

    if (PipelineExecuter.HasErrors)
    {
      transaction.Rollback();
    }
    else
    {
      transaction.Commit();
    }
  }

  transaction.Commit();
}
도움이 되었습니까?

해결책

ADO.NET 제공 업체가 제공하는 기능에 대한 세부 정보를 제공 할 수있는 내장 방법은 없습니다. SQLITE는 중첩 트랜잭션을 지원하지 않았지만 SQLITE의 일부 ADO.NET 제공 업체는 코드로 가짜 (저장 포인트에 대한 적절한 지원없이)를 가짜로 표시합니다. 이 경우 오류가 발생하지 않지만 예상 한 동작을 얻지 못할 수도 있습니다.

또한 IDATAREADER 인덱서의 다양한 구현을 보았습니다. 예전에는 일부 제공 업체가 존재하지 않는 필드 이름을 통과했을 때 예외를 던지고 일부 제공 업체는 NULL을 반환 할 것입니다. ADO.NET 2.0에서 도움말 문서는 공급자가 예외를 던져야한다는 것을 나타내도록 업데이트되었지만 예외없이 모든 공급자가 올바르게 업데이트되었는지 확인할 방법은 없습니다.

요컨대, System.data.common 네임 스페이스 및 다양한 ADO.NET 제공 업체는 다른 데이터베이스에서 작업하기가 훨씬 쉽지만 사용중인 DB (S)와 차이점을 알고 있어야합니다. 각 공급자 (대부분은 아마도 큰 차이와는 달리 문서화되지 않은 성가신 단일 일 것입니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top