2006-06-04

OLE DB Tips

multiple result set + parameter binding

  • 캐릭터 정보 로딩과 같이, 하나의 프로시저에서 여러 테이블의 row 들을 select 하면서 파라미터도 바인딩해야 할 경우, static binding 으로는 구현할 수 없으며, CDynamicParameterAccessor::GetParam()를 이용해야 한다.
  • 파라미터의 경우, select 해온 모든 result set 을 소진한 후, 가장 마지막에 읽어와야 한다. 즉 DB_S_NORESULT == GetNextResult(...); 를 실행한 후에만 유효하다는 뜻이다. 만약, 그 전에 읽게 되면 garbage 가 리턴된다.
  • Bind()와 무관하므로, GetInterface()!=NULL 체크를 할 필요가 없다.

CCommand::Prepare()

한번 생성후 재사용하는 구조가 필요하다.

GetNextResult(rowCount)

웬지 계속 -1 이 넘어오는 걸로 봐서 뭔가 문제가 있는 듯? property 설정이 필요한가?

DateTime to String

  • VarBstrFromDate 이걸 써야 될까나~
  • use
HRESULT DataConvert (
    DBTYPE          wSrcType,
    DBTYPE          wDstType,
    DBLENGTH        cbSrcLength,
    DBLENGTH *      pcbDstLength,
    void *          pSrc,
    void *          pDst,
    DBLENGTH        cbDstMaxLength,
    DBSTATUS        dbsSrcStatus,
    DBSTATUS *      pdbsStatus,
    BYTE            bPrecision,
    BYTE            bScale,
    DBDATACONVERT   dwFlags);

Connection Pooling

  • SqlServer Provider 를 기반으로, ThreadPooling 을 이용해 쿼리를 할 경우, DataSource 가 1개이고 Session 이 N 개를 생성했다면, 실제 DB에 대한 연결은 N 개가 된다.
  • 즉, Session 이 내부적으로 연결 풀링을 사용하게 되므로, DataSource 객체는 1개만 만들어도 된다.

어떤 Accessor 를 사용할 것인가?

MSDN 의 비교표를 간략하게 요약하면 다음과 같다.

  • CAccessor : 매크로를 이용한 컴파일 타임 바인딩이므로 성능 면에서 가장 우수하지만, 쉽게 말해서 하드코딩이므로 귀찮은 작업들이 많다. 컬럼 및 파라미터 바인딩 모두 지원.
  • CDynamicAccessor : 런타임 바인딩. 따라서 컬럼 정보를 읽어와야한다. 대신 파라미터 바인딩은 불가능. 뭔가 컴파일 타임에 정보를 알기 힘든 경우, 또는 multiple result set 을 리턴하는 프로시저에 사용하면 된다.
  • CDynamicParameterAccessor : CDynamicAccessor 에 파라미터 바인딩 기능이 추가되었다. 당연히 더욱 느려졌다.
  • CDynamicStringAccessor : CDynamicAccessor 와 유사하지만 컬럼값을 스트링으로 리턴한다.
  • CManualAccessor : AddBindEntry(), AddParameterEntry() 를 이용해서 수동으로 컬럼과 파라미터를 바인딩한다. 아마 CAccessor 에 이어 두번째로 빠른 듯.
  • CXMLAccessor : CDynamicStringAccessor 와 같지만, XML 스트링의 형태로 컬럼값을 리턴한다.

성능적인 순서로 정렬해 본다면 대충 다음과 같지 않을까? (이건 본인의 추측)

  • CAccessor < CManualAccessor < CDynamicAccessor < CDynamicStringAccessor < CXMLAccessor < CDynamicParameterAccessor

단, 파라미터 바인딩을 지원하는 넘은 아래의 3가지 뿐이다.

  • CAccessor
  • CManualAccessor
  • CDynamicParameterAccessor

see also


comments powered by Disqus