IM001驱动程序不支持此功能(ODBC)

时间:2013-07-17 19:46:35

标签: sql odbc database-connection

我正在构建自定义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或其他odbc客户端(如SqlDbx或QTODBC)时,一旦我尝试使用'myDSN'(使用我的自定义驱动程序)建立连接,我总是得到: [Microsoft] [ODBC驱动程序管理器]驱动程序不支持此功能

我已经正确地实现了SQLDriverConnect函数,通过从使用我编译的驱动程序DLL的用户DSN读取键值对来创建OutConnectionString。

我为所有odbc函数http://msdn.microsoft.com/en-us/library/windows/desktop/ms714562(v=vs.85).aspx

定义了骨架

我使用minGW编译器(32位)编译我的自定义潜水员。 我有64位Windows 7操作系统,但我正在运行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。

修改

想出来。 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

编译DLL(使用mingw(g ++))并包含.def文件,如:

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

编译器在此时给出了一个错误,即SQLDisconnect定义错误

1 个答案:

答案 0 :(得分:1)

我在该列表中没有SQLGetFunctions。您始终可以在驱动程序管理器中启用ODBC跟踪,它将显示ODBC调用的内容以及结果。