TN042: ODBC 드라이버 개발자가 권장 사항
[!참고]
온라인 설명서의을 처음 포함 되었습니다 때문 다음 기술 참고 업데이트 되지 않았습니다.따라서 일부 절차 및 항목 오래 되었거나 잘못 된 수 있습니다.최신 정보는 온라인 설명서 색인에서 관심 있는 주제에 대해 검색 하는 것이 좋습니다.
이 참고가 ODBC 드라이버 작성자에 대 한 지침을 설명합니다.일반 요구 사항 및 가정 만들기 MFC 데이터베이스 클래스는 ODBC 기능 및 다양 한 예상된 의미 세부 정보를 설명 합니다.드라이버 기능 세 가지를 지 원하는 데 필요한 CRecordset 열기 모드 (forwardOnly, 스냅샷 및 다이너셋) 설명 합니다.
ODBC 커서 라이브러리
MFC 데이터베이스 클래스는 능가 하는 경우도 대부분의 수준 1 ODBC 드라이버에서 제공 하는 기능은 대부분의 경우에서 사용자에 게 기능을 제공 합니다.다행 스럽게도 ODBC 커서 라이브러리가 자체 데이터베이스 클래스 드라이버 사이의 레이어 합니다 및이 추가 기능을 자동으로 제공 합니다.
예를 들어, 대부분의 1.0 드라이버 뒤로 스크롤 지원 하지 않습니다.커서 라이브러리 수이 감지 하 고 됩니다 캐시 드라이버에서 행 한 FETCH_PREV 호출에서 요청을 제공 SQLExtendedFetch.
커서 라이브러리에 대 한 종속성의 또 다른 중요 한 예는 위치 지정된 업데이트입니다.대부분의 1.0 드라이버 위치 지정된 업데이트도 필요는 없지만 커서 라이브러리는 현재 캐시 된 데이터 값 또는 캐시 된 타임 스탬프 값에 따라 데이터 원본에는 대상 행을 식별 하는 update 문을 생성 합니다.
클래스 라이브러리는 여러 행 집합을 사용 합니다.따라서 몇 가지 SQLSetPos 문 1 행 집합의 행에 적용 됩니다 항상.
CDatabases
각 CDatabase 단일 할당 HDBC.(경우 CDatabase의 ExecuteSQL 기능을 사용 하 고 있는 HSTMT 일시적으로 할당 됩니다.) 따라서 여러 경우 CDatabase의 여러 필요 HDBC당 s HENV 을 지원 해야 합니다.
데이터베이스 클래스는 커서 라이브러리가 필요합니다.이 반영 되어 있는 SQLSetConnections 호출 SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC.
SQLDriverConnect, SQL_DRIVER_COMPLETE 사용 하 여 CDatabase::Open 데이터 소스를 연결 합니다.
드라이버에서 지원 해야 SQLGetInfoSQL_ODBC_API_CONFORMANCE > = SQL_OAC_LEVEL1, SQLGetInfoSQL_ODBC_SQL_CONFORMANCE > = SQL_OSC_MINIMUM.
거래에 대 한 지원에 CDatabase 와 그 종속 레코드 집합 SQLGetInfoSQL_CURSOR_COMMIT_BEHAVIOR 및 SQL_CURSOR_ROLLBACK_BEHAVIOR 있어야 합니다 SQL_CR_PRESERVE.그렇지 않으면 트랜잭션 제어를 수행 하는 시도 무시 됩니다.
SQLGetInfoSQL_DATA_SOURCE_READ_ONLY 을 지원 해야 합니다.이 "Y"를 반환 하면 데이터 소스에 update 작업이 수행 됩니다.
경우는 CDatabase 열릴 ReadOnly, 읽을 데이터 원본 설정 하려고만 복사본을 SQLSetConnectOptionSQL_ACCESS_MODE, SQL_MODE_READ_ONLY.
식별자 인용 해야 하는 경우이 정보는 드라이버와 함께에서 반환 합니다는 SQLGetInfoSQL_IDENTIFIER_QUOTE_CHAR 를 호출 합니다.
디버깅 목적으로, SQLGetInfo SQL_DBMS_VER 및 SQL_DBMS_NAME 에서 드라이버를 검색 합니다.
SQLSetStmtOptionSQL_QUERY_TIMEOUT 및 SQL_ASYNC_ENABLE 에서 호출할 수 있는 CDatabase의 HDBC.
SQLError 또는 모든 인수가 NULL을 호출할 수 있습니다.
물론, SQLAllocEnv, SQLAllocConnect, SQLDisconnect 및 SQLFreeConnect 을 지원 해야 합니다.
ExecuteSQL
할당 하 고 임시 해제 하는 것 외에 HSTMT, ExecuteSQL 호출 SQLExecDirect, SQLFetch, SQLNumResultCol 및 SQLMoreResults.SQLCancel 를 호출할 수 있는 HSTMT.
GetDatabaseName
SQLGetInfoSQL_DATABASE_NAME 호출 됩니다.
BeginTrans, CommitTrans, Rollback
SQLSetConnectOptionSQL_AUTOCOMMIT 및 sqltransact 함수SQL_COMMIT, SQL_ROLLBACK 및 SQL_AUTOCOMMIT 트랜잭션 요청 되 면 호출 됩니다.
CRecordsets
SQLAllocStmt, SQLPrepare, SQLExecute (에 대 한 열기 및 Requery), SQLExecDirect (업데이트 작업에 대 한), SQLFreeStmt 지원 해야 합니다.SQLNumResultCols 및 SQLDescribeCol 여러 번 설정 하면 호출 됩니다.
SQLSetParam 매개 변수 데이터 바인딩을 위해 광범위 하 게 사용 되 고 DATA_AT_EXEC 기능.
SQLBindCol 광범위 하 게 등록 하는 데 odbc 열 데이터 저장소 위치를 출력 합니다.
두 SQLGetData 호출을 검색 하는 데 사용 됩니다 SQL_LONG_VARCHAR 및 SQL_LONG_VARBINARY 데이터입니다.첫 번째 호출은 호출 하 여 열 값의 총 길이 찾으려고 시도 SQLGetData cbMaxValue 0은 유효한 pcbValue 같지만.PcbValue 보유 하 고 있는 경우 SQL_NO_TOTAL에서 예외가 throw 됩니다.그렇지 않으면는 HGLOBAL 할당 되 고 다른 SQLGetData 전체 결과 검색 호출 합니다.
업데이트하는 중
비관적 잠금을 요청 하는 경우 SQLGetInfoSQL_LOCK_TYPES 를 쿼리할 수 있습니다.경우 SQL_LCK_EXCLUSIVE 는 지원 되지 않는 예외가 throw 됩니다.
업데이트 하려고 시도 CRecordset (스냅샷 또는 다이너셋) 두 번째 발생 합니다 HSTMT 할당 해야 합니다.지원 하지 않는 드라이버에 대 한 두 번째 HSTMT, 커서 라이브러리가이 기능을 시뮬레이션 합니다.불행 하 게도,이 때로는 현재 쿼리의 첫 강제 의미할 수 있습니다 HSTMT 완료 전에 두 번째 처리 HSTMT가 요청 합니다.
SQLFreeStmtSQL_CLOSE 및 SQL_RESET_PARAMS 및 SQLGetCursorName 업데이트 작업 중에 호출 됩니다.
있을 경우 CLongBinarys 에 있는 outputColumns, ODBC의 DATA_AT_EXEC 기능을 지원 해야 합니다.여기에 반환 SQL_NEED_DATA 에서 SQLExecDirect, SQLParamData 및 SQLPutData.
SQLRowCount 여만 1 개의 레코드가 업데이트 되었는지 확인 하려면 실행 한 후에 호출 되는 SQLExecDirect.
ForwardOnly 커서
만 SQLFetch 에 대 한 필요는 이동 작업.참고 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.
또한 비관적 잠금 요청 되 면 호출을 SQLSetPos 떼 irow 1, FALSE fRefresh SQL_LCK_EXCLUSIVE 될 예정.