次の方法で共有


テクニカル ノート 42: ODBC ドライバーの開発に関する推奨事項

[!メモ]

次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。

ここでは、 ODBC ドライバーのライターのガイドラインについて説明します。これは、 MFC データベース クラスを加えると、さまざまな予想される意味詳細について説明します。 ODBC の機能の一般的な要件と想定して。CRecordset の 3 種類のオープン モード (forwardOnlysnapshotdynaset)をサポートする必須ドライバー機能は説明します。

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_CURSORSSQL_CUR_USE_ODBCに反映されます。

CDatabase::Open によってSQLDriverConnectSQL_DRIVER_COMPLETE がデータ ソースへの接続を確立するために使用されます。

ドライバーは SQLGetInfoSQL_ODBC_API_CONFORMANCE の >= SQL_OAC_LEVEL1SQLGetInfoSQL_ODBC_SQL_CONFORMANCE の >= SQL_OSC_MINIMUMをサポートする必要があります。

CDatabase と依存したレコードセットでサポートされるトランザクションに SQLGetInfoSQL_CURSOR_COMMIT_BEHAVIORSQL_CURSOR_ROLLBACK_BEHAVIORSQL_CR_PRESERVEが必要です。それ以外の場合、トランザクションのコントロールを実行すると、無視されます。

SQLGetInfoSQL_DATA_SOURCE_READ_ONLY を サポートする必要があります。これが 「Y」を返す場合、更新操作は、データ ソースに行われません。

CDatabase が開かれた読み取り専用の場合は、読み取られるデータ ソースを設定しようとすると、 SQLSetConnectOptionSQL_ACCESS_MODESQL_MODE_READ_ONLYでのみ行います。

ID が引用が必要な場合、この情報は SQLGetInfoSQL_IDENTIFIER_QUOTE_CHAR の呼び出しを持つドライバーから返す必要があります。

デバッグするには、 SQLGetInfo SQL_DBMS_VERSQL_DBMS_NAME は、ドライバーから取得されます。

SQLSetStmtOptionSQL_QUERY_TIMEOUTSQL_ASYNC_ENABLE に呼び出される entity_CODECDatabase の HDBCである場合があります。

SQLError は、一部またはすべての引数の空白と呼ばれることがあります。

もちろん、 SQLAllocEnvSQLAllocConnectSQLDisconnectSQLFreeConnect をサポートする必要があります。

ExecuteSQL

一時 HSTMTの割り当てと解放だけでなく、 ExecuteSQLSQLExecDirectSQLFetchSQLNumResultColSQLMoreResultsをダイヤルします。SQLCancelHSTMTで呼び出される場合があります。

GetDatabaseName

SQLGetInfoSQL_DATABASE_NAME が呼び出されます。

BeginTrans、 CommitTrans のロールバック

トランザクションの要求が行われた場合SQLSetConnectOptionSQL_AUTOCOMMITSQLTransactSQL_COMMITSQL_ROLLBACKSQL_AUTOCOMMIT が呼び出されます。

CRecordsets

SQLAllocStmtSQLPrepareSQLExecute開く(&&O),開く,[開く]Requeryの場合)、 SQLExecDirect (更新操作の場合)、 SQLFreeStmt をサポートする必要があります。SQLNumResultColsSQLDescribeCol は、結果セットにさまざまな時点で呼び出されます。

SQLSetParam は、バインディングのパラメーター データと DATA_AT_EXEC の機能について広範に使用されます。

SQLBindCol が ODBC の出力列のデータ ストレージの場所を登録するために広く使用されています。

SQLGetData の 2 回の呼び出しが SQL_LONG_VARCHARSQL_LONG_VARBINARY のデータを取得するために使用されます。0 の cbMaxValue で、有効な pcbValue との SQLGetData を呼び出して、列の値の合計長を取得最初の呼び出しを試みます。pcbValue が SQL_NO_TOTALを保持すると、例外がスローされます。それ以外 HGLOBAL が割り当てられ、全体の結果を取得するに SQLGetData の別の呼び出しが行われました。

更新

排他的なロックを要求すると、 SQLGetInfoSQL_LOCK_TYPES が呼び出されます。SQL_LCK_EXCLUSIVE がサポートされていない場合は、例外がスローされます。

CRecordset を更新してみます (snapshotdynaset秒) HSTMT を割り当てます。2 番目の HSTMTをサポートしていないドライバーによっては、カーソル ライブラリは、この機能をシミュレートします。ただし、これは、完了に HSTMT の 2 番目の要求を処理する前に、最初の HSTMT の現在のクエリを強制することを意味する場合があります。

SQLFreeStmtSQL_CLOSESQL_RESET_PARAMSSQLGetCursorName は、更新操作時に呼び出されます。

outputColumnsCLongBinarys がある場合は、 ODBC DATA_AT_EXEC の機能がサポートされる必要があります。これは SQLExecDirectSQLParamDataSQLPutDataから返される SQL_NEED_DATA が含まれます。

SQLRowCount は、 1 レコードのみ SQLExecDirectして更新されたことを確認する実行の後に呼び出されます。

ForwardOnly のカーソル

SQLFetch のみ 移動 を操作できます。forwardOnly のカーソルが更新をサポートしないことに注意してください。

スナップショット カーソル

スナップショット機能は SQLExtendedFetch サポートを必要とします。上で説明したように、 ODBC カーソル ライブラリはドライバーが SQLExtendedFetchのサポートしない検出し、必要なサポート自体を示します。

SQLGetInfoSQL_SCROLL_OPTIONSSQL_SO_STATICをサポートする必要があります。

ダイナセットのカーソル

ダイナセットを開くために必要な最小限のサポートを示します。:

SQLGetInfoSQL_ODBC_VER は > 「01 " を返す必要があります。

SQLGetInfoSQL_SCROLL_OPTIONSSQL_SO_KEYSET_DRIVENをサポートする必要があります。

SQLGetInfoSQL_ROW_UPDATES は 「Y」を返す必要があります。

SQLGetInfoSQL_POSITIONED_UPDATESSQL_PS_POSITIONED_DELETESQL_PS_POSITIONED_UPDATEをサポートする必要があります。

また、排他的なロックを要求すると、 false irow 1、 fRefresh とグループ SQL_LCK_EXCLUSIVE との SQLSetPos への呼び出しが行われました。

参照

その他の技術情報

番号順テクニカル ノート

カテゴリ別テクニカル ノート