远程连接到 MS SQL - 使用 pyodbc 时出错 vs 使用 SQL Server Management Studio 成功

Posted

技术标签:

【中文标题】远程连接到 MS SQL - 使用 pyodbc 时出错 vs 使用 SQL Server Management Studio 成功【英文标题】:Remote connection to MS SQL - Error using pyodbc vs success using SQL Server Management Studio 【发布时间】:2016-01-06 14:01:52 【问题描述】:

我在同一网络中有一个 MS SQL 数据库,但在另一台计算机上。 使用 SQL Server Management Studio (SSMS) Express,我可以找到数据库并毫无问题地连接。

但是当我使用 pyodbc 连接到同一台服务器时:

import pyodbc

server = r"xxxER\xxxSQLSERV"
db = "xxxDB"
user = "xxx"
password = "xxxx"
conn = pyodbc.connect('DRIVER=SQL Server;SERVER='+server + ';DATABASE=' + db +';UID=' + user + ';PWD=' + password)

我收到以下错误:

pyodbc.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC SQL Server Driver]Login timeout expired (0) (SQLDriverConnect)')

OBS:我猜服务器字符串应该是正确的,因为如果我更改它,我总是会收到以下错误:

pyodbc.Error: ('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect); [01000] [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (Connect()). (53)')

此处显示使用 SQL Server Studio Express 远程连接成功的图像。

【问题讨论】:

使用此代码:conn = pyodbc.connect('DRIVER=ODBC Driver 17 for SQL Server;SERVER='+server + ';DATABASE=' + db +';UID=' + user + ';PWD=' + password) 如果不起作用,请将版本 17 更改为 15 或 14 或 ... 【参考方案1】:

“但是为什么...?”

对于那些对为什么感兴趣的人,SQL Server Management Studio (SSMS) 可以连接到servername\instance,而其他应用程序(例如我们的 pyodbc 应用程序)却不能,这是因为 SSMS 保留了一个 MRU(最近使用的) Windows 注册表中的端口号列表,位于

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SuperSocketNetLib\LastConnect

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSSQLServer\Client\SuperSocketNetLib\LastConnect

每个 MRU 条目(注册表值)如下所示:

Name: PANORAMA\SQLEXPRESS
Type: REG_SZ 
Data: -1006030326:tcp:PANORAMA,52865

一旦 SSMS 通过远程机器上的 SQL Browser 服务通过实例名称成功连接,即使 SQL Browser 不再在远程机器上运行,它也可以继续按实例名称连接,前提是端口号没有改变了。不使用此 MRU 列表的应用程序(例如我们的 pyodbc 应用程序)每次想要通过实例名称连接时都需要在远程计算机上运行 SQL Browser 服务。

最常见的场景:

我想连接到YOUR-PC\SQLEXPRESS。我尝试从MY-PC 上的 SSMS 执行此操作,但它不起作用,因为 SQL 浏览器安装时在YOUR-PC 上将“启动模式”设置为“手动”。 我要求您在YOUR-PC 上启动 SQL Browser 服务,您很乐意遵守,但您只是启动该服务而忘记将“启动模式”设置更改为“自动”。 我可以通过 SSMS 进行连接(在 MRU 中缓存YOUR-PC\SQLEXPRESS 端口)。我的 python 应用也可以连接。 下次YOUR-PC 重新启动后,我可以通过 SSMS(通过 MRU)连接,但我的 python 应用程序不能(因为 SQL Browser 服务不再在YOUR-PC 上运行)。

【讨论】:

【参考方案2】:

尝试指定端口:

import pyodbc

server = r"xxxER\xxxSQLSERV"
db = "xxxDB"
user = "xxx"
password = "xxxx"
port = "1433"
conn = pyodbc.connect('DRIVER=SQL Server;SERVER=' + server + ';PORT=' + port + ';DATABASE=' + db +';UID=' + user + ';PWD=' + password)

如果仍有问题,请尝试使用服务器的 IP 或 FQDN。

【讨论】:

请注意:Microsoft 的 SQL Server ODBC 驱动程序不支持连接字符串中的PORT= 属性。要指定端口,它必须在逗号后附加到服务器名称/IP,例如,192.168.1.128,1433【参考方案3】:

尝试将驱动程序从“SQL Server”更改为“SQL Server Native Client 11.0”。

我收到了同样的错误信息,这为我解决了问题。

【讨论】:

我想在现代 SQL Server 版本的某些配置下,古老的“SQL Server”驱动程序(专为 SQL Server 2000 及更早版本设计)可能不再能够连接。【参考方案4】:

我有这个问题。我可以连接 Management Studio (SSMS),但不能使用 pyodbc。 我添加了 sql 的 odbc 版本并工作了。

将您的代码更改为:

conn = pyodbc.connect('DRIVER=ODBC Driver 17 for SQL Server;SERVER='+server + ';DATABASE=' + db +';UID=' + user + ';PWD=' + password)

如果不起作用,请将版本 17 更改为 13 如果不是 11 。 List versions of ODBC.

【讨论】:

以上是关于远程连接到 MS SQL - 使用 pyodbc 时出错 vs 使用 SQL Server Management Studio 成功的主要内容,如果未能解决你的问题,请参考以下文章

如果 SQL Server 是 MS 2012,则从 Pyodbc 连接到 SQL 14 Azure db

sqlalchemy 无法连接到 ms sql server

使用Python通过Windows身份验证连接到MS SQL Server?

使用 Pyodbc 连接到具有用户定义函数的 MS Access 文件

Python pyodbc 连接到 ms 访问数据库

无法使用 pyodbc/pymssql 和 Robot Framework 连接到 SQL\Express