Microsoft Jet를 사용하면서 발생할 수 있는 문제 몇 가지에 대한 대처법

Microsoft Jet를 사용하면 상당히 편리한 부분이 많다. 물론 많은 부분을 놓치기는 하지만 오히려 일을 간단하게 만들어줄 수도 있는 것이 사실이다. 오늘 내가 올려볼 글은 Microsoft Jet로 Microsoft Access DB에 데이터를 쓰려고할 때 발생할 수 있는 몇 가지 상황에 대한 해결책을 소개하는 글이다.

* INSERT와 UPDATE를 OleDbParameter 객체로 수행하고 싶은데 잘 안되나요?

INSERT와 UPDATE를 OleDbParameter 객체로 수행하기 전에 살펴볼 몇 가지가 있다. 쿼리문에서 지정한 순서대로 Parameter 컬렉션에 Add 함수를 호출하여 추가해주고 추가한 객체의 Value 속성에 반드시 정확한 값을 기재해야 한다. 물론 이것을 실행하기에 앞서서 Clear 메서드로 추가된 모든 파라미터를 제거하는 것은 기본이다.

만약 한 번 만들어놓은 OleDbCommand 객체를 여러 차례 재사용하는 방식의 패턴을 사용 중이라면 OleDbCommand 객체가 올바르게 초기화되지 않았을 상황도 가정해보는 것이 좋다. 이럴 때에는 Command 객체 내의 Connection 객체가 우선 아직 살아있는 지의 여부를 먼저 살펴보고 살아있다면 CreateCommand 메서드를 호출하여 다시 해당 Command 객체에 대입해본다. 대개의 경우 이러한 방식으로 일명 “꼬임” 현상이 해결된다.

* 여러 개의 Data Reader를 열어놓고 써야 하는데 에러나요!

당연한 이야기이지만 Microsoft Access는 다중 연결을 지원하지 않는다. 하지만 다중 연결은 언제나 필요하다. 방법이 없을까? ADO .NET의 DataTable 객체가 그 해답이다. .NET 2.0 이전에서는 OleDbDataReader 객체를 닫기 전에 DataTable에 먼저 데이터를 저장하는 루틴을 따로 프로그래밍하면 되고, .NET 2.0 이후에는 DataTable의 새로운 Load 메서드를 사용하면 된다. 그리고 .NET 2.0 만의 특별한 기능이라면 이렇게 만들어진 DataTable에 대해 전용 IDataReader 객체를 얻어올 수 있다는 점이다.

그럼 이와 같은 방법은 결국 무엇인가? 바로 스냅샷 채집 기법이다. Microsoft Access를 데이터 소스로 사용한다는 것은 몇 가지 전제가 따르는데 그 중 하나가 동시성을 인정하지 않는다는 점이다. 따라서, 이런식으로 작업하더라도 큰 문제는 없다고 본다.

* 트랜잭션을 사용하고 있다면 반드시 꼼꼼히 체크해볼 것!

Microsoft Access도 트랜잭션은 지원한다. 그러므로 트랜잭션을 사용하고 있다면 정확하게 체크해야 한다. 트랜잭션도 제대로 마무리 짓지 않고 안된다고 소리치면 나중에 원인이 드러났을 때 얼굴 붉힐 일이 문제다.

* ExecuteNonQuery 함수를 우습게 보지 마라!

ExecuteNonQuery 함수의 반환 값을 의외로 무시하는 경향이 있다. 무시하면 안된다. 이 함수의 반환 값으로 쿼리가 잘 실행되었는지 아닌지를 판별할 수 있는 기준이 된다. 물론 데이터 프로바이더가 의도적으로 반환 값을 누락할 수도 있다. 하지만 이런 프로바이더는 도덕적으로 매우 문제가 심각한 제품이다.

댓글 남기기