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

このノートは、ODBC ドライバーの作成者のガイドラインを示します。それは一般的な要件と前提条件は、MFC データベース クラスを ODBC 機能のさまざまな期待されるセマンティクスの詳細について説明します。3 つCRecordsetのオープン モード (前方向スナップショットダイナセット) をサポートするために必要なドライバーの機能の説明します。

ODBC カーソル ライブラリ

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

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

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

クラス ライブラリの複数の行セットを使用することはないです。したがって、ほとんどのSQLSetPosステートメントは常に、行セットの行 1 に されます。

CDatabases

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

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

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

SQLGetInfoSQL_ODBC_API_CONFORMANCE gt;、ドライバーがサポートする必要がありますSQL_OAC_LEVEL1SQLGetInfoSQL_ODBC_SQL_CONFORMANCE = > SQL_OSC_MINIMUM = 。

トランザクションはCDatabaseとその依存のレコード セットをサポートするために、 SQLGetInfoSQL_CURSOR_COMMIT_BEHAVIORSQL_CURSOR_ROLLBACK_BEHAVIOR SQL_CR_PRESERVE必要があります。それ以外の場合、トランザクションの制御を実行するには無視されます。 。

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

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

識別子の引用が必要な場合は、この情報は、 SQLGetInfoSQL_IDENTIFIER_QUOTE_CHAR呼び出しをドライバーから返される必要があります。 。

デバッグするためと、 SQLGetInfo の SQL_DBMS_VERSQL_DBMS_NAMEドライバーから取得されます。

SQLSetStmtOptionSQL_QUERY_TIMEOUTSQL_ASYNC_ENABLECDatabaseHDBCで呼び出すことができます。 。

SQLErrorは任意またはすべての引数を NULL と呼ばれることがあります。

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

ExecuteSQL

追加の割り当て、および一時HSTMTを解放するExecuteSQL SQLExecDirectSQLFetchSQLNumResultCol指定して SQLMoreResultsを呼び出します。SQLCancel HSTMTと呼ばれることがあります。

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAMEが呼び出されます。

BeginTrans、CommitTrans、Rollback

SQLSetConnectOptionトランザクションの要求が行われる場合SQL_AUTOCOMMITから SQLTransactSQL_COMMITSQL_ROLLBACKSQL_AUTOCOMMITが呼び出されます 。

CRecordsets

SQLAllocStmtSQLPrepareSQLExecute (を開き再クエリ)、 SQLExecDirect (更新操作) は、 SQLFreeStmtをサポートする必要があります。SQLNumResultColsSQLDescribeColさまざまな設定が呼び出されます。

SQLSetParam広範囲DATA_AT_EXEC機能をパラメーターのデータのバインディングの使用します。

SQLBindColは広範囲を登録に使用列データのストレージ ロケーションを ODBC を出力。

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

更新

排他ロックが要求された場合は、 SQLGetInfoSQL_LOCK_TYPESが照会されます。SQL_LCK_EXCLUSIVEがサポートされていない場合は、例外がスローされます。 。

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

SQLFreeStmt SQL_CLOSESQL_RESET_PARAMSSQLGetCursorName更新操作中に呼び出される。

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

SQLRowCountはのみ 1 レコードSQLExecDirectによって更新されたことを確認を実行した後と呼ばれる。

前方向カーソル

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

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

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

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

ダイナセットのカーソル

以下は、ダイナセットを開くために必要最低限のサポート:

SQLGetInfoSQL_ODBC_VER gt を返す必要があります。「01」(&G)。

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

SQLGetInfoSQL_ROW_UPDATES "Y"を返す必要があります。

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

排他ロックが要求された場合は、さらには、 SQLSetPosの呼び出し irow 1、fRefresh FALSE と群れSQL_LCK_EXCLUSIVEされます。

番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)

Index