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 连接有效,应用程序无效的主要内容,如果未能解决你的问题,请参考以下文章