Linux 上的 SQL Server:来自 Windows 的 ODBC 连接有效,应用程序无效

Posted

技术标签:

【中文标题】Linux 上的 SQL Server:来自 Windows 的 ODBC 连接有效,应用程序无效【英文标题】:SQL Server on Linux: ODBC connection from Windows works, application does not 【发布时间】:2020-01-09 13:59:24 【问题描述】:

我有一个带有 Linux Ubuntu 16.04“服务器”的测试环境,运行 MS SQL Server 17,公司数据库在其中托管。我的客户端机器是 Windows 7 机器。

我已设法将数据库导入 Linux 服务器,并且能够从 Windows 客户端创建并成功测试 ODBC 连接。 Windows PC 上的 SQL Server Management Studio 能够在 Linux 上的 SQL Server 实例上创建/删除表、创建用户、对象等。

我在 VB 6.0 中连接如下

Dim rec1 As ADODB.Recordset 
Set rec1 = New ADODB.Recordset 
rec1.Open "Select * from tblSysReg", gstrDefaultDB, adOpenDynamic, adLockOptimistic 
gstrDefaultDB 是包含 ODBC 注册和测试连接名称的字符串。 连接测试凭据为:系统管理员 (sa) 和密码。 连接设置为使用 SQL Server 身份验证

这是产生错误的地方,如下所示:

自动化错误代码-2147217843

但是,当我从 Windows 客户端运行软件程序时,它无法从数据库表 (tblSysReg) 中“读取”并生成自动化错误。

成功的ODBC连接参数如下:

类型:TCP/IP 服务器:10.0.0.3 端口:1433

我使用我的 SQL Server 密码以“sa”身份登录,用于 Linux 上的 SQL Server。

我正在努力了解连接测试如何成功,使用连接的程序无法从 Linux 上的 SQL Server 数据库中的任何表中读取?

提前谢谢你。

【问题讨论】:

您能否发布您在应用程序中使用的连接字符串,以及您收到的具体错误? 该应用程序是使用Visual Basic 6开发的。用于访问数据库对象的代码如下: Dim rec1 As ADODB.Recordset Set rec1 = New ADODB.Recordset rec1.Open "Select * from tblSysReg ", gstrDefaultDB, adOpenDynamic, adLockOptimistic 这是产生错误的地方,如下:自动化错误代码-2147217843 gstrDefaultDB 是包含 ODBC 注册和测试连接名称的字符串。连接测试凭据是:系统管理员 (sa) 和密码。连接设置为使用 SQL Server 身份验证, Microsoft SQL Server ODBC 驱动程序版本 06.01.7601 正在运行连接测试... 正在尝试连接 已建立连接 正在验证选项设置 与服务器断开连接 测试成功完成! (实现了从 Windows 客户端到 Linux 托管 SQL Server 的连接。) 谢谢... 【参考方案1】:

根据 cmets 中的代码,您尝试将连接字符串传递给 rec1.Open() 而不是连接对象。您需要使用 Connection 对象打开与数据库的连接,然后在打开 Recordset 时使用该对象。

类似的东西

Dim conn as ADODB.Connection
Dim rec1 As ADODB.Recordset

Set conn = New ADODB.Connection
Set rec1 = New ADODB.Recordset

conn.Open gstrDefaultDB
rec1.Open "Select * from tblSysReg", conn, adOpenDynamic, adLockOptimistic
... [do more stuff] ...
rec1.Close
conn.Close

您还可以使用Connection 上的Execute 方法返回记录集。

Dim conn as ADODB.Connection
Dim rec1 As ADODB.Recordset

Set conn = New ADODB.Connection

conn.Open gstrDefaultDB
Set rec1 = conn.Execute("Select * from tblSysReg")
... [do more stuff] ...
rec1.Close
conn.Close

查看此页面了解更多示例:https://support.microsoft.com/en-us/help/168336/how-to-open-ado-connection-and-recordset-objects

【讨论】:

我会听从您的建议和回复。谢谢。 非常感谢,您的简单而有效的解决方案使我能够完成迁移到 Linux for SQL Server on Windows ..... 太棒了!祝你好运:) 我想提一下,我们在 Linux 上托管的新 SQL Server“服务器”的性能非常出色,整个练习非常值得。由于这种效率,我们现在还计划向更大的客户推广。

以上是关于Linux 上的 SQL Server:来自 Windows 的 ODBC 连接有效,应用程序无效的主要内容,如果未能解决你的问题,请参考以下文章

翻译

SQL Server on Red Hat Enterprise Linux——RHEL上的SQL Server(全截图)

Linux 上的 SQL Server 2005 扩展

Docker SQL Server 2017 上的 Linux 连接问题

Configure Red Hat Enterprise Linux shared disk cluster for SQL Server——RHEL上的“类”SQL Server Cluster功能

linux上的Django-pyodbc SQL Server/freetds服务器连接问题