2011-09-17 4 views
1

모든 SQL 공급자 유형으로 다시 사용할 수있는 데이터 액세스 계층을 만들려고합니다. 내가 싫어하는 것은 각각의 알려진 제공자에 대해 마지막으로 생성 된 레코드의 id를 얻는 다른 방법을 지정하는 switch 문을 사용하는 것입니다. DbConnection은 일반적인 방식으로 마지막으로 생성 된 레코드의 ID에 액세스하는 방법을 제공합니까?DbConnection을 사용하여 마지막 레코드 삽입 - C#

답변

2

나는 이것에 대해 낙관하지 않을 것입니다. 일부 데이터베이스는 ID 값 (예 : SQL Server, MySQL)을 만드는 자동화 기능을 제공합니다. 연결은 자동으로 값을 제공하지 않습니다. 당신은 그것을 요구해야합니다. SQL Server에서

INSERT INTO FOO (...) VALUES(...); SELECT SCOPE_IDENTITY; 

오라클에는 ID 열의 개념조차 없습니다. 아이디 값을 생성하는 것은 기존 아이디 값의 MAX + 1을 가져 오거나 SEQUENCE 및 TRIGGER를 사용하여 아이디 값을 추가하는 것을 의미합니다. 어느 쪽이든, 정확성을 보장하기 위해 트랜잭션에서이 값을 모두 감쌀 필요가 있습니다. 그리고 SEQUENCE 솔루션의 경우 트랜잭션의 일부로 시퀀스 값을 다시 얻으려면 별도의 SELECT를 실행해야합니다. 아마도 MAX + 1 접근 방식을 사용하여 그렇게해야 할 것입니다.하지만 모든 애플리케이션에서 그 방향을 결정하지 못했기 때문에 확실하게 말할 수는 없습니다. 자동화 된 신원 솔루션이있는 데이터베이스는 각 insert-ID 요청을 래핑하는 트랜잭션이 필요하지 않습니다.

일반적으로 데이터베이스는 단일 "표준"이 아닌 SQL의 방언을 지원하는 경향이 있으며 액세스 방법 측면에서 훨씬 다양합니다. "공통 하위 집합"을 지원하려고 시도하면 유용성을 높이기위한 가능성을 너무 좁힐 수 있습니다. DbConnection, DbCommand 등의 접근 방식을 사용하면 ID 열 생성에서 벗어나는 유일한 방법으로 응용 프로그램 코드에서 GUID를 생성하는 것으로 제한됩니다.

다른 솔루션은 모델을 기본 (잘 숨겨진) 액세스 레이어로 매핑하는 ORM입니다. Entity Framework는 거기에 도달하려하지만 EF의 모델과 연결 문자열 간의 상호 의존성으로 인해 연결 문자열을 생성하는 것이 문제가됩니다. Codeplex의 IQToolkit 프로젝트는 LINQ를 데이터베이스에 매핑하는 다른 접근 방식을 취하지 만 고유 한 연결 구현뿐만 아니라 생성 된 SQL을 특정 제약 조건에 맞게 구체화하는 SQL 포맷터 및 언어 정책 모듈을 제공하는 플러그인 공급자를 필요로합니다 데이터베이스 구현.

내 느낌은 DbConnection이 공동성을 시작하기위한 장소를 찾는 잘못된 장소라는 것입니다. 지원해야하는 각 데이터베이스의 단점을 이해해야합니다. 즉, 공통 액세스 계층에서 래핑을 시작하기 전에 프로그래밍 작업을 매우 수월하게해야합니다. 그들이 어떻게 작동하는지 충분히 이해할 수 있도록 ORM을 살펴보십시오. 그들이 제공 할 수있는 진정한 공통점은 "나에게 연결을 제공하기"보다는 "이 신원을 가진 리퍼러 레코드를 얻으십시오"부터 시작합니다. 이들은 연결과 명령을 숨길뿐만 아니라 때로는 데이터베이스 생성기와의 긴밀한 협력을 통해 명령 생성기를 제공합니다. 대부분 테이블, 모델 또는 특정 쿼리 (예 : LINQ 기반)에 매핑 된 클래스로 결과를 제공합니다.

응용 프로그램의 나머지 부분에서 데이터베이스의 세부 정보를 숨기려면 모든 것을 숨겨야합니다. ADO.NET의 추상 데이터 액세스 클래스로는 충분하지 않습니다.

아니면 다시 ODBC로 전환 할 수 있습니다.하지만 그 자체만으로는 여러 가지 문제가 있습니다. 물론 훨씬 더 쓸모가 없습니다.

+0

저는 @Cylon에 동의합니다. 장래에 switch 문을 봅니다. –

+0

또는 대리인. 대리인은 더 깨끗한 코드를 만듭니다. –

+0

Cyclon이 내 옵션을 분명히 해 주셔서 감사합니다. 나는 새로운 데이터베이스를 지원하고자 할 때마다 특별한 코드를 추가하는 방법을 찾아야 할 것이다. 나는 ORM을 시험해 보는 데 약간의 시간을 할애 할 것이다. – enamrik