비고
다음 기술 정보는 온라인 설명서에 처음 포함되었으므로 업데이트되지 않았습니다. 따라서 일부 절차와 항목이 만료되거나 올바르지 않을 수 있습니다. 최신 정보는 온라인 설명서 인덱스의 관심 항목을 검색하는 것이 좋습니다.
이 참고에서는 ODBC 드라이버 작성기에 대한 지침을 설명합니다. MFC 데이터베이스 클래스가 만드는 ODBC 기능의 일반적인 요구 사항 및 가정 및 다양한 예상 의미 체계 세부 정보를 간략하게 설명합니다. 세 CRecordset
가지 열기 모드(forwardOnly, 스냅샷 및 다이나셋)를 지원하는 데 필요한 드라이버 기능이 설명되어 있습니다.
ODBC 커서 라이브러리
MFC 데이터베이스 클래스는 대부분의 경우 대부분의 수준 1 ODBC 드라이버에서 제공하는 기능을 능가하는 기능을 사용자에게 제공합니다. 다행히 ODBC의 커서 라이브러리는 데이터베이스 클래스와 드라이버 간에 계층화되며 이 추가 기능의 대부분을 자동으로 제공합니다.
예를 들어 대부분의 1.0 드라이버는 뒤로 스크롤을 지원하지 않습니다. 커서 라이브러리는 이를 감지할 수 있으며 드라이버에서 행을 캐시하고 FETCH_PREV 호출 SQLExtendedFetch
에 요청된 대로 표시합니다.
커서 라이브러리 의존성의 또 다른 중요한 예는 위치 지정 업데이트입니다. 대부분의 1.0 드라이버에는 위치 지정된 업데이트가 없지만 커서 라이브러리는 현재 캐시된 데이터 값 또는 캐시된 타임스탬프 값을 기반으로 데이터 원본의 대상 행을 식별하는 업데이트 문을 생성합니다.
클래스 라이브러리는 여러 행 집합을 사용하지 않습니다. 따라서 몇 개의 문장은 항상 행 집합의 첫 번째 행에 적용됩니다.
CDatabases
각 CDatabase
는 하나의 HDBC를 할당합니다. (CDatabase
의 ExecuteSQL
함수를 사용하는 경우, 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_TIMEOUT
및 SQL_ASYNC_ENABLE은 CDatabase
의 HDBC에서 호출될 수 있습니다.
SQLError
는 인수가 NULL일 경우 어느 하나 또는 전체 인수를 사용하여 호출될 수 있습니다.
물론 SQLAllocEnv
, SQLAllocConnect
, SQLDisconnect
, SQLFreeConnect
는 반드시 지원되어야 합니다.
ExecuteSQL
임시 HSTMT를 할당하고 해제하는 것 외에도, ExecuteSQL
는 SQLExecDirect
, SQLFetch
, SQLNumResultCol
및 SQLMoreResults
를 호출합니다.
SQLCancel
는 HSTMT에서 호출될 수 있습니다.
데이터베이스 이름 가져오기
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에 등록하는 데 광범위하게 사용됩니다.
두 SQLGetData
호출은 SQL_LONG_VARCHAR 및 SQL_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_CLOSE
및 SQL_RESET_PARAMSSQLGetCursorName
업데이트 작업 중에 호출됩니다.
outputColumns에 CLongBinarys가 있는 경우 ODBC의 DATA_AT_EXEC 기능을 지원해야 합니다. 여기에는 에서 SQL_NEED_DATA를 반환하는 것이 포함됩니다 SQLExecDirect
, SQLParamData
, 및 SQLPutData
.
SQLRowCount
는 실행 후 호출되어 1 레코드만 업데이트 SQLExecDirect
되었는지 확인합니다.
단일 방향 커서
SQLFetch
작업에는 Move
만 필요합니다.
forwardOnly 커서는 업데이트를 지원하지 않습니다.
스냅샷 커서
스냅샷 기능에는 SQLExtendedFetch
지원이 필요합니다. 위에서 설명한 것처럼 ODBC 커서 라이브러리는 드라이버가 지원하지 SQLExtendedFetch
않는 경우를 감지하고 필요한 지원 자체를 제공합니다.
SQLGetInfo
SQL_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_UPDATES는 SQL_PS_POSITIONED_DELETE 및 SQL_PS_POSITIONED_UPDATE를 지원해야 합니다.
또한 비관적 잠금이 요청되면 irow를 1로 하고, fRefresh를 FALSE로, fLock을 SQLSetPos
로 설정하여 를 호출합니다.
참고하십시오
숫자로 된 기술 노트
범주별 기술 정보