首页 > 解决方案 > 我的 odbc api 函数没有从 ODBC 测试中调用

问题描述

在过去的几周里,我一直在努力实现自定义 odbc 函数。这就是我所在的地方。我设法实现了设置功能,一切正常。我可以创建 DSN,它会调用我的 ConfigDSN 函数,它会在 ODBC.INI 下的注册表中注册我的 ODBC,它会设置指向我的 customOdbcApi.dll 的驱动程序键和值。

问题是当我尝试连接到我的 DSN 时,它没有调用任何函数,如 SQLConnect。

这是我尝试连接到“AiPandaOdbc”时得到的响应 在此处输入图像描述

但是在我的函数中,我实现了一个应该弹出的消息对话框,我从函数返回 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 函数并将其导出,但仍然没有。

在此处输入图像描述

标签: c++apidllodbc

解决方案


要么调用 SQLConnectW 并传递实际的 SQLWCHAR DSN 字符串,要么调用 SQLConnectA 显式调用 ANSI 函数,或者在构建代码时取消定义 UNICODE(将 #undef UNICODE 添加到源代码顶部)以防止对 SQLConnect 的调用被悄悄映射到 SQLConnectW。

我猜您将强制转换添加到 SQLWCHAR* 以防止编译器抱怨这是没有调用 SQLConnect 的线索。


推荐阅读