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
- Which accessor should I use? from MSDN