gpt4 book ai didi

c - SQLDriverConnect 在 Linux 上崩溃

转载 作者:行者123 更新时间:2023-11-30 16:15:26 25 4
gpt4 key购买 nike

我有一个 Windows 应用程序,正在将其移植到 UNIX/Linux。此应用程序使用 ODBC 连接到 SQL Server。在本例中,SQL Server 运行在 Windows 服务器上,但我认为这并不重要。

问题是我需要与服务器建立多个连接。因此应用程序多次调用 SQLDriverConnect()(使用不同的连接句柄)。在 Windows 上这工作得很好。但在 Linux 上,第二次调用崩溃了。

当然,我的实际应用程序测试了 SQL 函数的返回值。但缩减后的样本没有出现任何错误,因此我删除了这些测试。

我已将完整的应用程序缩减为 10 行程序,但结果相同。

SQLHANDLE henv, hdbc1, hdbc2;
char connstr[] = "DRIVER={ODBC Driver 11 for SQL Server};<other necessary params>";
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, 0);
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc2);
SQLDriverConnect(hdbc1, NULL, connstr, strlen(connstr),
NULL, 0, &need, SQL_DRIVER_NOPROMPT);
SQLDriverConnect(hdbc2, NULL, connstr, strlen(connstr),
NULL, 0, &need, SQL_DRIVER_NOPROMPT);

我希望第二次调用成功(或者至少返回一个错误)。相反,应用程序会因“内存故障”而严重崩溃。如果我使用 gdb 调试程序,我会得到更多信息:

程序收到信号 SIGSEGV,段错误。0x0000000000000000 在?? ()

您可能想知道为什么我需要与服务器的多个连接。事实上,我可能不会,但这是他们目前编写应用程序的方式。如果我可以使用 ODBC 调用设置一些标志以从单个连接获取多个结果集,那么我就会这样做。但我没有运气使用该功能。

非常感谢

最佳答案

这似乎是由于我正在使用的 ODBC 驱动程序管理器造成的。我正在使用的机器上安装了多个。如果我设置不同的 ODBC 驱动程序管理器,一切都会按预期工作。

失败的 ODBC 驱动程序管理器是 unixODBC 的自制版本。成功的 ODBC 驱动程序管理器是 native Red Hat Linux 版本(无论是什么)。我不知道这是 unixODBC 的错误,还是我们特定构建的错误,还是其他原因。但我确实知道,当使用 Red Hat 版本的 ODBC 驱动程序管理器时,我的示例程序可以正常工作,而且我的完整应用程序也可以正常工作。

关于c - SQLDriverConnect 在 Linux 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57101807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com