c++ - 我的 odbc api 函数没有从 ODBC 测试中调用
问题描述
在过去的几周里,我一直在努力实现自定义 odbc 函数。这就是我所在的地方。我设法实现了设置功能,一切正常。我可以创建 DSN,它会调用我的 ConfigDSN 函数,它会在 ODBC.INI 下的注册表中注册我的 ODBC,它会设置指向我的 customOdbcApi.dll 的驱动程序键和值。
问题是当我尝试连接到我的 DSN 时,它没有调用任何函数,如 SQLConnect。
但是在我的函数中,我实现了一个应该弹出的消息对话框,我从函数返回 0 而不是 -2
到目前为止我检查的内容:
注册表中的路径是正确的,它指向 odbcDriver.dll
我添加了 .def 文件,在其中添加了我想要导出的所有函数。
唯一非常有趣的是,如果我将 MessageBox 调用放在 DllMain 中,则会显示消息框,所以我的 dll 100% 被识别。
我错过或忘记添加什么以便调用我的函数?
编辑:我也尝试使用控制台应用程序但仍然没有,SQLAllocHandle 返回 0 但 SQLConnect 返回 -1
编辑2:
我添加了#undef UNICODE,所以我确保他调用SQLConnect 而不是SQLConnectW。但问题依然存在。我的 SQLConnect 仍然没有被调用。
<html>
<head></head>
<body>
<h1>ODBC TRACE LOG</h1>
<textarea style="width:90%;height:900px;">
ConsoleApplicat 3120-6500 ENTER SQLAllocHandle
SQLSMALLINT 1 <SQL_HANDLE_ENV>
SQLHANDLE 0x00000000
SQLHANDLE * 0x00A5C138
ConsoleApplicat 3120-6500 EXIT SQLAllocHandle with return code 0 (SQL_SUCCESS)
SQLSMALLINT 1 <SQL_HANDLE_ENV>
SQLHANDLE 0x00000000
SQLHANDLE * 0x00A5C138 ( 0x00DD7938)
ConsoleApplicat 3120-6500 ENTER SQLSetEnvAttr
SQLHENV 0x00DD7938
SQLINTEGER 200 <SQL_ATTR_ODBC_VERSION>
SQLPOINTER 3 <SQL_OV_ODBC3>
SQLINTEGER 0
ConsoleApplicat 3120-6500 EXIT SQLSetEnvAttr with return code 0 (SQL_SUCCESS)
SQLHENV 0x00DD7938
SQLINTEGER 200 <SQL_ATTR_ODBC_VERSION>
SQLPOINTER 3 <SQL_OV_ODBC3>
SQLINTEGER 0
ConsoleApplicat 3120-6500 ENTER SQLAllocHandle
SQLSMALLINT 2 <SQL_HANDLE_DBC>
SQLHANDLE 0x00DD7938
SQLHANDLE * 0x00A5C13C
ConsoleApplicat 3120-6500 EXIT SQLAllocHandle with return code 0 (SQL_SUCCESS)
SQLSMALLINT 2 <SQL_HANDLE_DBC>
SQLHANDLE 0x00DD7938
SQLHANDLE * 0x00A5C13C ( 0x00DD79B8)
ConsoleApplicat 3120-6500 ENTER SQLConnectW
HDBC 0x00DD79B8
WCHAR * 0x00DD04D0 [ -3] "AiPandaODBC\ 0"
SWORD -3
WCHAR * 0x73382440 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x73382440 [ -3] "******\ 0"
SWORD -3
ConsoleApplicat 3120-6500 EXIT SQLConnectW with return code -1 (SQL_ERROR)
HDBC 0x00DD79B8
WCHAR * 0x00DD04D0 [ -3] "AiPandaODBC\ 0"
SWORD -3
WCHAR * 0x73382440 [ -3] "******\ 0"
SWORD -3
WCHAR * 0x73382440 [ -3] "******\ 0"
SWORD -3
DIAG [IM001] [Microsoft][ODBC Driver Manager] Driver does not support this function (0)
ConsoleApplicat 3120-6500 ENTER SQLFreeHandle
SQLSMALLINT 1 <SQL_HANDLE_ENV>
SQLHANDLE 0x00A5C138
ConsoleApplicat 3120-6500 EXIT SQLFreeHandle with return code -2 (SQL_INVALID_HANDLE)
SQLSMALLINT 1 <SQL_HANDLE_ENV>
SQLHANDLE 0x00A5C138
ConsoleApplicat 3120-6500 ENTER SQLFreeHandle
SQLSMALLINT 2 <SQL_HANDLE_DBC>
SQLHANDLE 0x00A5C13C
ConsoleApplicat 3120-6500 EXIT SQLFreeHandle with return code -2 (SQL_INVALID_HANDLE)
SQLSMALLINT 2 <SQL_HANDLE_DBC>
SQLHANDLE 0x00A5C13C
</textarea>
</body>
</html>
出于某种原因,即使我放了#undef UNICODE,他仍继续调用 SQLConnectW
编辑 - 我尝试添加 SQLConnectW 函数并将其导出,但仍然没有。
解决方案
要么调用 SQLConnectW 并传递实际的 SQLWCHAR DSN 字符串,要么调用 SQLConnectA 显式调用 ANSI 函数,或者在构建代码时取消定义 UNICODE(将 #undef UNICODE 添加到源代码顶部)以防止对 SQLConnect 的调用被悄悄映射到 SQLConnectW。
我猜您将强制转换添加到 SQLWCHAR* 以防止编译器抱怨这是没有调用 SQLConnect 的线索。
推荐阅读
- javascript - Javascript 不会输出到 HTML
- r - tabItem 不显示 R 闪亮
- date - 如何将日期时间转换为erlang中的日期名称和月份名称?
- google-apps-script - 带有谷歌电子表格的 OnEdit 函数脚本
- python-3.x - GUI中的基本计算器
- powerquery - 自定义列电源查询编辑器 - 过滤器
- java - Swing JTextField 文本更改侦听器 DocumentListener 无限循环
- reactjs - react - setState 的简写形式
- html - 在两个文本对象上使用位置
- c# - 使用 C# 的 HP ALM REST API - 更新测试集中的数据