我正在構建自定義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定義不正確