2

カスタム ODBC ドライバーを作成しています。

私の主な方法:

int main(int argc, char** argv) {

    SQLRETURN status;
    //SQLHANDLE hEnv;
    //SQLHANDLE hStmt;
    SQLHENV hEnv;
    SQLHDBC dbc = 0;
    SQLHSTMT hStmt;
    SQLCHAR ConnStrOut[1024];

    SQLSMALLINT x;

    // startup banner
    //printf();

    MessageBox(GetDesktopWindow(), "ODBC Client\n\n", "Driver", MB_OK);

    // show query to be executed
    printf("Query: %s\n", "SELECT VISITS FROM TRAFFIC");

    // allocate ENVIRONMENT
    status = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);

    // check for error
    ODBC_CHK_ERROR(SQL_HANDLE_ENV, hEnv, status, "");

    // set the ODBC version for behaviour expected
    status = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0);
    CHECK_STATUS(status, (UCHAR*)"SQLSetEnvAttr", hEnv, SQL_HANDLE_ENV);

    // check for error
    ODBC_CHK_ERROR(SQL_HANDLE_ENV, hEnv, status, "");

    // allocate CONNECTION
    status = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &dbc);

    // check for error
    ODBC_CHK_ERROR(SQL_HANDLE_ENV, hEnv, status, "");


    // ----------- real connection takes place at this point 

   status = SQLDriverConnect(dbc, GetDesktopWindow(),
            (unsigned char*) "DSN=myDSN",
            SQL_NTS, ConnStrOut, 1024, &x,
            SQL_DRIVER_PROMPT);


    if (SQL_SUCCEEDED(status)) {
        printf("Connected\n");
        printf("Returned connection string was:\n\t%s\n", ConnStrOut);
        //SQLDisconnect(dbc);   
    }

サンプル クライアントを使用して main を実行すると、すべてがうまく機能します。

ただし、odbc テスト ツール odbcte32 や、SqlDbx や QTODBC などの他の odbc クライアントを試すと、'myDSN' (カスタム ドライバーを使用) を使用して接続を確立しようとすると、常に[Microsoft][ODBC ドライバーManager] ドライバはこの機能をサポートしていません

コンパイルしたドライバー DLL を使用するユーザー DSN からキーと値のペアを読み取って、OutConnectionString を作成する SQLDriverConnect 関数を適切に実装しました。

すべての odbc 関数のスケルトンを定義しましたhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms714562(v=vs.85).aspx

minGW コンパイラ (32 ビット) を使用してカスタム ダイバーをコンパイルします。Windows 7 OS 64 ビットを使用していますが、32 ビットの ODBC テスト ツールを実行しています。

これは私を夢中にさせています。使用しているドライバーでサポートされていない特定の機能がわかりません。ここでも、必要なすべての機能のスケルトンを作成しました。リストは次のとおりです。

SQLAllocConnect , SQLAllocEnv , SQLAllocStmt , SQLAllocHandle , SQLFreeConnect , SQLFreeEnv , SQLFreeStmt , SQLBindCol , SQLCancel , SQLConnect , SQLDescribeCol , SQLDisconnect , SQLExecDirect , SQLExecute , SQLExtendedFetch , SQLFetch , SQLGetCursorName , SQLNumResultCols , SQLPrepare , SQLRowCount , SQLSetCursorName , SQLColumns , SQLDriverConnect , SQLGetData , SQLGetInfo , SQLGetTypeInfo 、 SQLParamData 、 SQLPutData 、 SQLStatistics 、 SQLTables 、 SQLBrowseConnect 、 SQLColumnPrivileg、 SQLDescribeParam 、 SQLForeignKeys 、 SQLMoreResults 、 SQLNativeSql 、 SQLNumParams 、SQLPrimaryKeys , SQLProcedureColum, SQLProcedures , SQLSetPos , SQLTablePrivilege, SQLBindParameter , SQLCloseCursor , SQLColAttribute , SQLCopyDesc , SQLEndTran , SQLFetchScroll , SQLFreeHandle , SQLGetConnectAttr, SQLGetDescField , SQLGetDescRec , SQLGetDiagField , SQLGetDiagRec , SQLGetEnvAttr , SQLGetStmtAttr , SQLSetConnectAttr, SQLSetDescField , SQLSetDescRec , SQLSetEnvAttr , SQLSetStmtAttr , SQLBulkOperations, SQLSpecialColumns。SQLFreeHandle 、 SQLGetConnectAttr 、 SQLGetDescField 、 SQLGetDescRec 、 SQLGetDiagField 、 SQLGetDiagRec 、 SQLGetEnvAttr 、 SQLGetStmtAttr 、 SQLSetConnectAttr 、 SQLSetDescField 、 SQLSetDescRec 、 SQLSetEnvAttr 、 SQLSetStmtAttr 、 SQLBulkOperations 、 SQLSpecialColumns.SQLFreeHandle 、 SQLGetConnectAttr 、 SQLGetDescField 、 SQLGetDescRec 、 SQLGetDiagField 、 SQLGetDiagRec 、 SQLGetEnvAttr 、 SQLGetStmtAttr 、 SQLSetConnectAttr 、 SQLSetDescField 、 SQLSetDescRec 、 SQLSetEnvAttr 、 SQLSetStmtAttr 、 SQLBulkOperations 、 SQLSpecialColumns.

編集:

理解した。SQLDisconnect が正しく定義されていません。渡されたすべてのパラメーターが正しいことを確認してください。正しい定義は次のとおりです。

RETCODE SQL_API SQLDisconnect(SQLHDBC pHandle) {
    __CHK_HANDLE(pHandle, SQL_HANDLE_DBC, SQL_ERROR);
    _SQLFreeDiag(_DIAGCONN(pHandle));
    _SQLDisconnect((PGENODBCCONN) pHandle);

    return (SQL_SUCCESS);
}

私がそれを理解した方法:.defファイルを作成し(ドライバーDLLファイル名と同じ名前を付けます。つまり、私の場合はaxodbc.defでした)、ドライバーに存在するすべての関数を次のようにリストします。

LIBRARY   axodbc
DESCRIPTION "Driver 1 definitions"
EXPORTS
    SQLAllocConnect
    SQLAllocEnv
    SQLAllocStmt
    SQLAllocHandle
    SQLFreeConnect
    SQLFreeEnv
    SQLFreeStmt
    SQLBindCol
    SQLCancel
    SQLConnect
    SQLDescribeCol
    SQLExecDirect
    SQLExecute
    SQLDisconnect
    SQLExtendedFetch
    SQLFetch
    SQLGetCursorName
    SQLNumResultCols
    SQLPrepare
    SQLRowCount
    SQLSetCursorName
    SQLColumns
    SQLDriverConnect
    SQLGetData
    SQLGetInfo
    SQLGetTypeInfo
    SQLParamData
    SQLPutData
    SQLStatistics
    SQLTables
    SQLBrowseConnect
    SQLColumnPrivileges
    SQLDescribeParam
    SQLForeignKeys
    SQLMoreResults
    SQLNativeSql
    SQLNumParams
    SQLPrimaryKeys
    SQLProcedureColumns
    SQLProcedures
    SQLSetPos
    SQLTablePrivileges
    SQLBindParameter
    SQLCloseCursor
    SQLColAttribute
    SQLCopyDesc
    SQLEndTran
    SQLFetchScroll
    SQLFreeHandle
    SQLGetConnectAttr
    SQLGetDescField
    SQLGetDescRec
    SQLGetDiagField
    SQLGetDiagRec
    SQLGetEnvAttr
    SQLGetStmtAttr
    SQLSetConnectAttr
    SQLSetDescField
    SQLSetDescRec
    SQLSetEnvAttr
    SQLSetStmtAttr
    SQLBulkOperations
    SQLSpecialColumns

(mingw (g++) を使用して) DLL をコンパイルし、次のような .def ファイルをインクルードします。

g++ -shared -o axodbc.dll axodbc.cpp connectionmanager.cpp diagnostics.cpp myresources.res axodbc.def -lodbc32 -lodbccp32 

この時点で、SQLDisconnect が正しく定義されていないというエラーがコンパイラから返されました

4

1 に答える 1

1

そのリストには SQLGetFunctions はありません。ドライバー マネージャーでいつでも ODBC トレースを有効にすることができ、どのような ODBC 呼び出しが行われ、どのような結果が得られたかが表示されます。

于 2013-07-18T08:03:42.490 に答える