次の方法で共有


TN042: ODBC ドライバー開発者向けの推奨事項

次のテクニカル ノートは、最初にオンライン ドキュメントに含まれてから更新されていません。 その結果、一部の手順やトピックが古くなっているか、正しくない可能性があります。 最新情報については、オンライン ドキュメント インデックスで関心のあるトピックを検索することをお勧めします。

このメモでは、ODBC ドライバー ライターのガイドラインについて説明します。 MFC データベース クラスが行う ODBC 機能の一般的な要件と前提条件、および予期されるさまざまなセマンティックの詳細について概説します。 3 つの CRecordset オープン モード (forwardOnlyスナップショットダイナセット) をサポートするために必要なドライバー機能について説明します。

ODBC のカーソル ライブラリ

MFC データベース クラスは、多くの場合、ほとんどのレベル 1 ODBC ドライバーによって提供される機能を超える機能をユーザーに提供します。 さいわい、ODBC のカーソル ライブラリは、データベース クラスとドライバーの間でそれ自体をレイヤー化し、この追加機能の多くを自動的に提供します。

たとえば、ほとんどの 1.0 ドライバーは後方スクロールをサポートしていません。 カーソル ライブラリはこれを検出でき、ドライバーから行をキャッシュし、 SQLExtendedFetchのFETCH_PREV呼び出しで要求された行を提示します。

カーソル ライブラリ依存のもう 1 つの重要な例は、位置更新です。 ほとんどの 1.0 ドライバーにも配置された更新プログラムはありませんが、カーソル ライブラリは、現在キャッシュされているデータ値またはキャッシュされたタイムスタンプ値に基づいてデータ ソース上のターゲット行を識別する更新ステートメントを生成します。

クラス ライブラリでは、複数の行セットは使用されません。 そのため、いくつかの SQLSetPos ステートメントは、常に行セットの行 1 に適用されます。

CDatabases

CDatabase は、1 つの HDBC を割り当てます。 (CDatabaseExecuteSQL関数を使用すると、HSTMT が一時的に割り当てられます)。そのため、複数のCDatabaseが必要な場合は、HENV ごとに複数の HDBCをサポートする必要があります。

データベース クラスにはカーソル ライブラリが必要です。 これは、SQL_CUR_USE_ODBCのSQLSetConnections呼び出しSQL_ODBC_CURSORSに反映されます

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

ドライバーは、 SQLGetInfo SQL_ODBC_API_CONFORMANCE>= SQL_OAC_LEVEL1SQLGetInfo SQL_ODBC_SQL_CONFORMANCE>= SQL_OSC_MINIMUMをサポートする必要があります。

CDatabaseとその依存レコードセットに対してトランザクションをサポートするには、SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIORSQL_CURSOR_ROLLBACK_BEHAVIORSQL_CR_PRESERVEが必要です。 それ以外の場合、トランザクション制御の実行は無視されます。

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY がサポートされている必要があります。 "Y" が返された場合、データ ソースに対して更新操作は実行されません。

CDatabaseが ReadOnly を開いた場合、データ ソースの読み取り専用の設定は、SQL_MODE_READ_ONLYSQLSetConnectOption SQL_ACCESS_MODEで行われます。

識別子に引用符が必要な場合は、 SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR 呼び出しでドライバーからこの情報を返す必要があります。

デバッグの目的で、 SQLGetInfo SQL_DBMS_VERSQL_DBMS_NAME はドライバーから取得されます。

SQLSetStmtOption SQL_QUERY_TIMEOUT SQL_ASYNC_ENABLEは、CDatabaseHDBC で呼び出される可能性があります。

SQLError は、任意またはすべての引数 NULL で呼び出される場合があります。

もちろん、 SQLAllocEnvSQLAllocConnectSQLDisconnectSQLFreeConnect がサポートされている必要があります。

ExecuteSQL

一時的な HSTMT の割り当てと解放に加えて、 ExecuteSQLSQLExecDirectSQLFetchSQLNumResultCol 、および SQLMoreResultsを呼び出します。 SQLCancel は HSTMT で呼び出される場合があります。

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAME が呼び出されます。

BeginTrans、CommitTrans、Rollback

SQLSetConnectOption SQL_AUTOCOMMIT トランザクション要求が行われた場合、 SQLTransact SQL_COMMITSQL_ROLLBACKおよびSQL_AUTOCOMMIT が呼び出されます。

CRecordsets

SQLAllocStmtSQLPrepareSQLExecute ( OpenRequeryの場合)、 SQLExecDirect (更新操作の場合)、 SQLFreeStmt がサポートされている必要があります。 SQLNumResultColsSQLDescribeCol は、さまざまな時間に設定された結果に対して呼び出されます。

SQLSetParam は、パラメーター データと DATA_AT_EXEC 機能のバインドに広く使用されます。

SQLBindCol は、出力列データの格納場所を ODBC に登録するために広く使用されます。

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

更新中

ペシミスティック ロックが要求された場合、 SQLGetInfo SQL_LOCK_TYPES が照会されます。 SQL_LCK_EXCLUSIVEがサポートされていない場合は、例外がスローされます。

CRecordset (スナップショットまたはダイナセット) を更新しようとすると、2 つ目の HSTMT が割り当てられます。 2 番目の HSTMT をサポートしていないドライバーの場合、カーソル ライブラリはこの機能をシミュレートします。 残念ながら、これは、2 番目の HSTMT 要求を処理する前に、最初の HSTMT で現在のクエリを強制的に完了することを意味する場合があります。

SQLFreeStmt SQL_CLOSE および SQL_RESET_PARAMSSQLGetCursorName は、更新操作中に呼び出されます。

outputColumnsCLongBinarys がある場合は、ODBC のDATA_AT_EXEC機能をサポートする必要があります。 これには、SQLExecDirectSQLParamData、およびSQLPutDataからのSQL_NEED_DATAの返しが含まれます。

SQLRowCount は、 SQLExecDirectによって更新されたレコードが 1 つだけであることを確認するために、実行後に呼び出されます。

ForwardOnly カーソル

Move操作には、SQLFetchのみが必要です。 forwardOnly カーソルは更新プログラムをサポートしないことに注意してください。

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

スナップショット機能には SQLExtendedFetch サポートが必要です。 前述のように、ODBC カーソル ライブラリは、ドライバーが SQLExtendedFetchをサポートしていない場合を検出し、必要なサポート自体を提供します。

SQLGetInfoでは 、SQL_SCROLL_OPTIONSSQL_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 SQL_LCK_EXCLUSIVEを使用してSQLSetPosの呼び出しが行われます。

こちらも参照ください

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