2013-07-17 101 views
1

我正在構建自定義ODBC驅動程序。IM001驅動程序不支持此功能(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); 
    } 

一切運作良好時,我用我的樣本客戶端運行爲主。但是,當我嘗試使用odbc測試工具odbcte32或其他odbc客戶端(如SqlDbx或QTODBC)時,一旦嘗試使用'myDSN'(使用我的自定義驅動程序)建立連接,我總是會得到:[微軟] [ODBC驅動程序管理器]驅動程序不支持此功能

我已經正確實施SQLDriverConnect函數通過讀取使用我的編譯驅動程序DLL用戶DSN鍵 - 值對創建OutConnectionString。

我已經爲所有ODBC函數http://msdn.microsoft.com/en-us/library/windows/desktop/ms714562(v=vs.85).aspx

我用MinGW的編譯器(32位)編譯我的自定義潛水員定義骨架。 我有Windows 7操作系統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。

編輯:

想通了。 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(克++)),幷包括您的.DEF文件,喜歡的東西:

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

編譯器給了我一個錯誤,在這一點上,SQLDisconnect定義不正確

回答

1

我沒有在該列表中的SQLGetFunctions。您始終可以在驅動程序管理器中啓用ODBC跟蹤,並顯示進行的ODBC調用以及結果。