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 함수를 사용하는 경우 CDatabaseHSTMT가 일시적으로 할당됩니다.) 따라서 여러 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_TIMEOUTSQL_ASYNC_ENABLE HDBC에서 CDatabase호출될 수 있습니다.

SQLError 은 NULL 인수 또는 모든 인수를 사용하여 호출할 수 있습니다.

물론 지원 SQLAllocEnvSQLAllocConnectSQLDisconnectSQLFreeConnect 되어야 합니다.

ExecuteSQL

임시 HSTMT, ExecuteSQL 호출 SQLNumResultColSQLExecDirectSQLFetchSQLMoreResults및 해제 외에도 . SQLCancel는 HSTMT에서 호출될 수 있습니다.

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAME 가 호출됩니다.

BeginTrans, CommitTrans, Rollback

SQLSetConnectOption SQL_AUTOCOMMIT트랜잭션 SQLTransact SQL_COMMIT요청이 이루어지면 SQL_ROLLBACKSQL_AUTOCOMMIT 호출됩니다.

CRecordsets

SQLAllocStmt, SQLPrepareSQLExecute (For OpenRequery), SQLExecDirect (업데이트 작업의 경우) SQLFreeStmt 지원되어야 합니다. SQLNumResultColsSQLDescribeCol 다양한 시간에 설정된 결과에 대해 호출됩니다.

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_CLOSESQL_RESET_PARAMSSQLGetCursorName 업데이트 작업 중에 호출됩니다.

outputColumns에 CLongBinarys가 있는 경우 ODBC의 DATA_AT_EXEC 기능이 지원되어야 합니다. 여기에는 다음에서 SQLParamDataSQLExecDirectSQL_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"를 반환해야 합니다.

SQLGetInfoSQL_POSITIONED_UPDATES SQL_PS_POSITIONED_DELETESQL_PS_POSITIONED_UPDATE 지원해야 합니다.

또한 비관적 잠금이 요청되면 irow 1, fRefresh FALSE 및 fLock SQL_LCK_EXCLUSIVE 호출 SQLSetPos 합니다.

참고 항목

번호별 기술 참고 사항
범주별 기술 참고 사항