TN042: ODBC 드라이버 개발자 권장 사항
참고 항목
다음 기술 노트는 온라인 설명서에 먼저 포함되어 있었으므로 업데이트되지 않았습니다. 따라서 일부 절차 및 항목은 만료되거나 올바르지 않을 수 있습니다. 최신 정보를 보려면 온라인 설명서 색인에서 관심 있는 항목을 검색하는 것이 좋습니다.
이 참고에서는 ODBC 드라이버 작성기에 대한 지침을 설명합니다. MFC 데이터베이스 클래스가 만드는 ODBC 기능의 일반적인 요구 사항 및 가정 및 다양한 예상 의미 체계 세부 정보를 간략하게 설명합니다. 세 CRecordset
가지 열기 모드(forwardOnly, 스냅샷 및 다이나셋)를 지원하는 데 필요한 드라이버 기능에 대해 설명합니다.
ODBC 커서 라이브러리
MFC 데이터베이스 클래스는 대부분의 경우 대부분의 수준 1 ODBC 드라이버에서 제공하는 기능을 능가하는 기능을 사용자에게 제공합니다. 다행히 ODBC의 커서 라이브러리는 데이터베이스 클래스와 드라이버 간에 계층화되며 이 추가 기능의 대부분을 자동으로 제공합니다.
예를 들어 대부분의 1.0 드라이버는 뒤로 스크롤을 지원하지 않습니다. 커서 라이브러리는 이를 감지할 수 있으며 드라이버에서 행을 캐시하고 FETCH_PREV 호출 SQLExtendedFetch
에 요청된 대로 표시합니다.
커서 라이브러리 의존성의 또 다른 중요한 예는 위치 지정 업데이트입니다. 대부분의 1.0 드라이버에는 위치 지정된 업데이트가 없지만 커서 라이브러리는 현재 캐시된 데이터 값 또는 캐시된 타임스탬프 값을 기반으로 데이터 원본의 대상 행을 식별하는 업데이트 문을 생성합니다.
클래스 라이브러리는 여러 행 집합을 사용하지 않습니다. 따라서 몇 SQLSetPos
가지 문은 항상 행 집합의 행 1에 적용됩니다.
CDatabases
각각 CDatabase
은 단일 HDBC를 할당합니다. ('s ExecuteSQL
함수를 사용하는 경우 CDatabase
HSTMT가 일시적으로 할당됩니다.) 따라서 여러 CDatabase
's가 필요한 경우 HENV당 여러 HDBC를 지원해야 합니다.
데이터베이스 클래스에는 커서 라이브러리가 필요합니다. 이는 SQL_CUR_USE_ODBC SQL_ODBC_CURSORS 호출에 SQLSetConnections
반영됩니다.
SQLDriverConnect
SQL_DRIVER_COMPLETE 데이터 원본에 CDatabase::Open
대한 연결을 설정하는 데 사용됩니다.
드라이버는 = SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE
>= SQL_OSC_MINIMUM 지원SQLGetInfo SQL_ODBC_API_CONFORMANCE
>해야 합니다.
트랜잭션이 종속 레코드 집합 및 해당 종속 레코드 집합 SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR
에 대해 CDatabase
지원되려면 SQL_CURSOR_ROLLBACK_BEHAVIOR SQL_CR_PRESERVE 있어야 합니다. 그렇지 않으면 트랜잭션 제어를 수행하려는 시도가 무시됩니다.
SQLGetInfo SQL_DATA_SOURCE_READ_ONLY
는 지원되어야 합니다. "Y"를 반환하는 경우 데이터 원본에서 업데이트 작업이 수행되지 않습니다.
ReadOnly를 CDatabase
열면 데이터 원본 읽기 전용SQLSetConnectOption SQL_ACCESS_MODE
을 설정하려는 시도가 SQL_MODE_READ_ONLY.
식별자에 따옴표가 필요한 경우 호출을 사용하여 드라이버 SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR
에서 이 정보를 반환해야 합니다.
디버깅을 위해 SQLGetInfo SQL_DBMS_VER
드라이버에서 SQL_DBMS_NAME 검색됩니다.
SQLSetStmtOption SQL_QUERY_TIMEOUT
및 SQL_ASYNC_ENABLE HDBC에서 CDatabase
호출될 수 있습니다.
SQLError
은 NULL 인수 또는 모든 인수를 사용하여 호출할 수 있습니다.
물론 지원 SQLAllocEnv
SQLAllocConnect
SQLDisconnect
SQLFreeConnect
되어야 합니다.
ExecuteSQL
임시 HSTMT, ExecuteSQL
호출 SQLNumResultCol
SQLExecDirect
SQLFetch
SQLMoreResults
및 해제 외에도 . SQLCancel
는 HSTMT에서 호출될 수 있습니다.
GetDatabaseName
SQLGetInfo SQL_DATABASE_NAME
가 호출됩니다.
BeginTrans, CommitTrans, Rollback
SQLSetConnectOption SQL_AUTOCOMMIT
트랜잭션 SQLTransact SQL_COMMIT
요청이 이루어지면 SQL_ROLLBACK 및 SQL_AUTOCOMMIT 호출됩니다.
CRecordsets
SQLAllocStmt
, SQLPrepare
SQLExecute
(For Open
및 Requery
), SQLExecDirect
(업데이트 작업의 경우) SQLFreeStmt
지원되어야 합니다. SQLNumResultCols
은 SQLDescribeCol
다양한 시간에 설정된 결과에 대해 호출됩니다.
SQLSetParam
는 매개 변수 데이터 및 DATA_AT_EXEC 기능을 바인딩하는 데 광범위하게 사용됩니다.
SQLBindCol
는 출력 열 데이터 스토리지 위치를 ODBC에 등록하는 데 광범위하게 사용됩니다.
두 호출은 SQL_LONG_VARCHAR 검색하고 데이터를 SQL_LONG_VARBINARY 데 사용됩니다.SQLGetData
첫 번째 호출은 cbMaxValue가 0이지만 유효한 pcbValue를 사용하여 호출 SQLGetData
하여 열 값의 총 길이를 찾으려고 시도합니다. pcbValue가 SQL_NO_TOTAL 있으면 예외가 throw됩니다. 그렇지 않으면 HGLOBAL 이 할당되고 전체 결과를 검색하기 위한 또 다른 SQLGetData
호출이 발생합니다.
업데이트
비관적 잠금이 요청 SQLGetInfo SQL_LOCK_TYPES
되면 쿼리됩니다. SQL_LCK_EXCLUSIVE 지원되지 않으면 예외가 throw됩니다.
(스냅샷 또는 다이나셋)을 CRecordset
업데이트하려고 하면 두 번째 HSTMT가 할당됩니다. 두 번째 HSTMT를 지원하지 않는 드라이버의 경우 커서 라이브러리가 이 기능을 시뮬레이션합니다. 아쉽게도 이는 두 번째 HSTMT의 요청을 처리하기 전에 첫 번째 HSTMT의 현재 쿼리가 완료되도록 강제하는 것을 의미할 수 있습니다.
SQLFreeStmt SQL_CLOSE
및 SQL_RESET_PARAMS SQLGetCursorName
업데이트 작업 중에 호출됩니다.
outputColumns에 CLongBinarys가 있는 경우 ODBC의 DATA_AT_EXEC 기능이 지원되어야 합니다. 여기에는 다음에서 SQLParamData
SQLExecDirect
SQL_NEED_DATA 반환하는 것이 포함됩니다SQLPutData
.
SQLRowCount
는 실행 후 호출되어 1 레코드만 업데이트 SQLExecDirect
되었는지 확인합니다.
ForwardOnly 커서
작업에만 SQLFetch
필요합니다 Move
. forwardOnly 커서는 업데이트를 지원하지 않습니다.
스냅샷 커서
스냅샷 기능에는 SQLExtendedFetch
지원이 필요합니다. 위에서 설명한 것처럼 ODBC 커서 라이브러리는 드라이버가 지원하지 SQLExtendedFetch
않는 경우를 감지하고 필요한 지원 자체를 제공합니다.
SQLGetInfo
, SQL_SCROLL_OPTIONS SQL_SO_STATIC 지원해야 합니다.
다이너셋 커서
다음은 다이나셋을 여는 데 필요한 최소 지원입니다.
SQLGetInfo
, SQL_ODBC_VER "01"을 반환 > 해야 합니다.
SQLGetInfo
, SQL_SCROLL_OPTIONS SQL_SO_KEYSET_DRIVEN 지원해야 합니다.
SQLGetInfo
, SQL_ROW_UPDATES "Y"를 반환해야 합니다.
SQLGetInfo
SQL_POSITIONED_UPDATES SQL_PS_POSITIONED_DELETE 및 SQL_PS_POSITIONED_UPDATE 지원해야 합니다.
또한 비관적 잠금이 요청되면 irow 1, fRefresh FALSE 및 fLock SQL_LCK_EXCLUSIVE 호출 SQLSetPos
합니다.