다음을 통해 공유


TN042: ODBC 드라이버 개발자 권장 사항

비고

다음 기술 정보는 온라인 설명서에 처음 포함되었으므로 업데이트되지 않았습니다. 따라서 일부 절차와 항목이 만료되거나 올바르지 않을 수 있습니다. 최신 정보는 온라인 설명서 인덱스의 관심 항목을 검색하는 것이 좋습니다.

이 참고에서는 ODBC 드라이버 작성기에 대한 지침을 설명합니다. MFC 데이터베이스 클래스가 만드는 ODBC 기능의 일반적인 요구 사항 및 가정 및 다양한 예상 의미 체계 세부 정보를 간략하게 설명합니다. 세 CRecordset 가지 열기 모드(forwardOnly, 스냅샷다이나셋)를 지원하는 데 필요한 드라이버 기능이 설명되어 있습니다.

ODBC 커서 라이브러리

MFC 데이터베이스 클래스는 대부분의 경우 대부분의 수준 1 ODBC 드라이버에서 제공하는 기능을 능가하는 기능을 사용자에게 제공합니다. 다행히 ODBC의 커서 라이브러리는 데이터베이스 클래스와 드라이버 간에 계층화되며 이 추가 기능의 대부분을 자동으로 제공합니다.

예를 들어 대부분의 1.0 드라이버는 뒤로 스크롤을 지원하지 않습니다. 커서 라이브러리는 이를 감지할 수 있으며 드라이버에서 행을 캐시하고 FETCH_PREV 호출 SQLExtendedFetch에 요청된 대로 표시합니다.

커서 라이브러리 의존성의 또 다른 중요한 예는 위치 지정 업데이트입니다. 대부분의 1.0 드라이버에는 위치 지정된 업데이트가 없지만 커서 라이브러리는 현재 캐시된 데이터 값 또는 캐시된 타임스탬프 값을 기반으로 데이터 원본의 대상 행을 식별하는 업데이트 문을 생성합니다.

클래스 라이브러리는 여러 행 집합을 사용하지 않습니다. 따라서 몇 개의 문장은 항상 행 집합의 첫 번째 행에 적용됩니다.

CDatabases

CDatabase는 하나의 HDBC를 할당합니다. (CDatabaseExecuteSQL 함수를 사용하는 경우, HSTMT가 일시적으로 할당됩니다.) 따라서 여러 CDatabase가 필요한 경우, HENV당 여러 HDBC를 지원해야 합니다.

데이터베이스 클래스에는 커서 라이브러리가 필요합니다. 이는 SQLSetConnections 호출 SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC에서 표시됩니다.

SQLDriverConnect, 가 데이터 소스에 연결을 설정하기 위해 CDatabase::Open를 사용합니다.

드라이버는 = SQLGetInfo SQL_ODBC_API_CONFORMANCE , >= SQLGetInfo SQL_ODBC_SQL_CONFORMANCE 지원>해야 합니다.

트랜잭션이 CDatabase 및 해당 종속 레코드 집합 SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR에 대해 지원되려면, SQL_CURSOR_ROLLBACK_BEHAVIOR의 값이 SQL_CR_PRESERVE여야 합니다. 그렇지 않으면 트랜잭션 제어를 수행하려는 시도가 무시됩니다.

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY 는 지원되어야 합니다. "Y"를 반환하는 경우 데이터 원본에서 업데이트 작업이 수행되지 않습니다.

CDatabase이(가) ReadOnly로 열리면 데이터 원본을 읽기 전용으로 설정하려는 시도가 SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY와 함께 이루어집니다.

식별자에 따옴표가 필요한 경우, SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR 호출을 통해 드라이버에서 이 정보를 반환해야 합니다.

디버깅을 위해 드라이버에서 SQLGetInfo SQL_DBMS_VER을 가져옵니다.

SQLSetStmtOption SQL_QUERY_TIMEOUTSQL_ASYNC_ENABLECDatabaseHDBC에서 호출될 수 있습니다.

SQLError는 인수가 NULL일 경우 어느 하나 또는 전체 인수를 사용하여 호출될 수 있습니다.

물론 SQLAllocEnv, SQLAllocConnect, SQLDisconnect, SQLFreeConnect는 반드시 지원되어야 합니다.

ExecuteSQL

임시 HSTMT를 할당하고 해제하는 것 외에도, ExecuteSQLSQLExecDirect, SQLFetch, SQLNumResultColSQLMoreResults를 호출합니다. SQLCancel 는 HSTMT에서 호출될 수 있습니다.

데이터베이스 이름 가져오기

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에 등록하는 데 광범위하게 사용됩니다.

SQLGetData 호출은 SQL_LONG_VARCHARSQL_LONG_VARBINARY 데이터를 검색하는 데 사용됩니다. 첫 번째 호출은 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 업데이트 작업 중에 호출됩니다.

outputColumnsCLongBinarys가 있는 경우 ODBC의 DATA_AT_EXEC 기능을 지원해야 합니다. 여기에는 에서 SQL_NEED_DATA를 반환하는 것이 포함됩니다 SQLExecDirect, SQLParamData, 및 SQLPutData.

SQLRowCount 는 실행 후 호출되어 1 레코드만 업데이트 SQLExecDirect되었는지 확인합니다.

단일 방향 커서

SQLFetch 작업에는 Move만 필요합니다. forwardOnly 커서는 업데이트를 지원하지 않습니다.

스냅샷 커서

스냅샷 기능에는 SQLExtendedFetch 지원이 필요합니다. 위에서 설명한 것처럼 ODBC 커서 라이브러리는 드라이버가 지원하지 SQLExtendedFetch않는 경우를 감지하고 필요한 지원 자체를 제공합니다.

SQLGetInfoSQL_SCROLL_OPTIONS SQL_SO_STATIC 지원해야 합니다.

다이너셋 커서

다음은 다이나셋을 여는 데 필요한 최소 지원입니다.

SQLGetInfo, SQL_ODBC_VER "01"을 반환 > 해야 합니다.

SQLGetInfo, SQL_SCROLL_OPTIONSSQL_SO_KEYSET_DRIVEN 지원해야 합니다.

SQLGetInfo, SQL_ROW_UPDATES "Y"를 반환해야 합니다.

SQLGetInfo, SQL_POSITIONED_UPDATESSQL_PS_POSITIONED_DELETESQL_PS_POSITIONED_UPDATE를 지원해야 합니다.

또한 비관적 잠금이 요청되면 irow를 1로 하고, fRefresh를 FALSE로, fLock을 SQLSetPos로 설정하여 를 호출합니다.

참고하십시오

숫자로 된 기술 노트
범주별 기술 정보