我正在构建自定义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定义错误
答案 0 :(得分:1)
我在该列表中没有SQLGetFunctions。您始终可以在驱动程序管理器中启用ODBC跟踪,它将显示ODBC调用的内容以及结果。