テクニカル ノート 42: ODBC ドライバーの開発に関する推奨事項
[!メモ]
次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。
ここでは、 ODBC ドライバーのライターのガイドラインについて説明します。これは、 MFC データベース クラスを加えると、さまざまな予想される意味詳細について説明します。 ODBC の機能の一般的な要件と想定して。CRecordset の 3 種類のオープン モード (forwardOnly、 snapshot と dynaset)をサポートする必須ドライバー機能は説明します。
ODBC カーソル ライブラリ
MFC データベース クラスは、多くの場合、ほとんどのレベル 1 の ODBC ドライバーによって提供される機能以外に、ユーザーによる操作を示します。しかし、 ODBC カーソル ライブラリはデータベース クラスとドライバーの間に層に、自動的にこの追加機能の多くを提供します。
たとえば、ほとんどは 1.0 ドライバー後方スクロールをサポートしません。カーソル ライブラリはこれを検出し、ドライバーから行をキャッシュし、 SQLExtendedFetchの FETCH_PREV の呼び出しで要求されるように示します。
カーソル ライブラリの依存のもう一つの重要な例は、位置指定付き更新です。ほとんどに、 1.0 ドライバー位置指定更新はありませんが、カーソル ライブラリは現在のキャッシュされたデータ値に基づいてデータ ソースのターゲット行を識別する、またはキャッシュ タイムスタンプ値を生成して更新ステートメント。
クラス ライブラリは、複数の行セットを使用しません。したがって、行セットの 1 行をために、 SQLSetPos 少数のステートメントが常に適用されます。
CDatabases
各 CDatabase は、単一の HDBCを割り当てます。entity_CODECDatabase の ExecuteSQL 関数が使用される場合 (、 HSTMT は一時的に割り当てられます。)したがって、複数の entity_CODECDatabase が必要な場合は、 HENV ごとの HDBCの複数の秒をサポートする必要があります。
データベース クラスは、カーソル ライブラリが必要です。これは SQLSetConnections の呼び出し SQL_ODBC_CURSORS、 SQL_CUR_USE_ODBCに反映されます。
CDatabase::Open によってSQLDriverConnect、 SQL_DRIVER_COMPLETE がデータ ソースへの接続を確立するために使用されます。
ドライバーは 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」を返す場合、更新操作は、データ ソースに行われません。
CDatabase が開かれた読み取り専用の場合は、読み取られるデータ ソースを設定しようとすると、 SQLSetConnectOptionSQL_ACCESS_MODE、 SQL_MODE_READ_ONLYでのみ行います。
ID が引用が必要な場合、この情報は SQLGetInfoSQL_IDENTIFIER_QUOTE_CHAR の呼び出しを持つドライバーから返す必要があります。
デバッグするには、 SQLGetInfo SQL_DBMS_VER と SQL_DBMS_NAME は、ドライバーから取得されます。
SQLSetStmtOptionSQL_QUERY_TIMEOUT と SQL_ASYNC_ENABLE に呼び出される entity_CODECDatabase の HDBCである場合があります。
SQLError は、一部またはすべての引数の空白と呼ばれることがあります。
もちろん、 SQLAllocEnv、 SQLAllocConnect、 SQLDisconnect と SQLFreeConnect をサポートする必要があります。
ExecuteSQL
一時 HSTMTの割り当てと解放だけでなく、 ExecuteSQL は SQLExecDirect、 SQLFetch、 SQLNumResultCol と SQLMoreResultsをダイヤルします。SQLCancel は HSTMTで呼び出される場合があります。
GetDatabaseName
SQLGetInfoSQL_DATABASE_NAME が呼び出されます。
BeginTrans、 CommitTrans のロールバック
トランザクションの要求が行われた場合SQLSetConnectOptionSQL_AUTOCOMMIT と SQLTransactSQL_COMMIT、 SQL_ROLLBACK と SQL_AUTOCOMMIT が呼び出されます。
CRecordsets
SQLAllocStmt、 SQLPrepare、 SQLExecute ( 開く(&&O),開く,[開く] と Requeryの場合)、 SQLExecDirect (更新操作の場合)、 SQLFreeStmt をサポートする必要があります。SQLNumResultCols と SQLDescribeCol は、結果セットにさまざまな時点で呼び出されます。
SQLSetParam は、バインディングのパラメーター データと DATA_AT_EXEC の機能について広範に使用されます。
SQLBindCol が ODBC の出力列のデータ ストレージの場所を登録するために広く使用されています。
SQLGetData の 2 回の呼び出しが SQL_LONG_VARCHAR と SQL_LONG_VARBINARY のデータを取得するために使用されます。0 の cbMaxValue で、有効な pcbValue との SQLGetData を呼び出して、列の値の合計長を取得最初の呼び出しを試みます。pcbValue が SQL_NO_TOTALを保持すると、例外がスローされます。それ以外 HGLOBAL が割り当てられ、全体の結果を取得するに SQLGetData の別の呼び出しが行われました。
更新
排他的なロックを要求すると、 SQLGetInfoSQL_LOCK_TYPES が呼び出されます。SQL_LCK_EXCLUSIVE がサポートされていない場合は、例外がスローされます。
CRecordset を更新してみます (snapshot か dynaset秒) HSTMT を割り当てます。2 番目の HSTMTをサポートしていないドライバーによっては、カーソル ライブラリは、この機能をシミュレートします。ただし、これは、完了に HSTMT の 2 番目の要求を処理する前に、最初の HSTMT の現在のクエリを強制することを意味する場合があります。
SQLFreeStmtSQL_CLOSE と SQL_RESET_PARAMS と SQLGetCursorName は、更新操作時に呼び出されます。
outputColumnsに CLongBinarys がある場合は、 ODBC DATA_AT_EXEC の機能がサポートされる必要があります。これは SQLExecDirect、 SQLParamData と SQLPutDataから返される SQL_NEED_DATA が含まれます。
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をサポートする必要があります。
また、排他的なロックを要求すると、 false irow 1、 fRefresh とグループ SQL_LCK_EXCLUSIVE との SQLSetPos への呼び出しが行われました。