我有一个要移植到UNIX / Linux的Windows应用程序。此应用程序使用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 in ?? ()
您可能想知道为什么我需要与服务器建立多个连接。实际上,我可能没有,但是这是当前编写应用程序的方式。如果我可以使用ODBC调用设置一些标志来从单个连接中获取多个结果集,那么我会这样做。但是我还没有运气。
非常感谢
答案 0 :(得分:0)
这似乎是由于我使用的ODBC驱动程序管理器。我正在使用的计算机上安装了多个。如果我设置了其他的ODBC驱动程序管理器,那么一切都会按需进行。
失败的ODBC驱动程序管理器是unixODBC的自制版本。成功的ODBC驱动程序管理器是本机Red Hat Linux版本(无论是哪种版本)。我不知道这是unixODBC的错误,还是我们特定版本的错误,还是其他原因。但是我确实知道,当使用Red Hat版本的ODBC驱动程序管理器时,我的示例程序可以正常工作,并且整个应用程序都可以正常工作。