.NET 데이터 제공 업체 - 수행 할 수있는 작업을 어떻게 결정합니까?
-
19-09-2019 - |
문제
거래를 지원하지 않거나 중첩 거래를 지원하지 않는 제공자를 사용하여 실행할 수있는 코드가 있습니다.
그러한 지원을 프로그래밍 방식으로 어떻게 결정합니까?
예를 들어 아래 코드는 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)와 차이점을 알고 있어야합니다. 각 공급자 (대부분은 아마도 큰 차이와는 달리 문서화되지 않은 성가신 단일 일 것입니다).