远程连接到 MS SQL - 使用 pyodbc 出错,而使用 SQL Server Management Studio 则成功

6
我在同一网络中的另一台计算机上拥有一个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远程连接成功的图片。

enter image description here


1
如果无法连接,请使用以下代码:conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server + ';DATABASE=' + db +';UID=' + user + ';PWD=' + password),将版本号17更改为15或14等。 - Tomy
4个回答

3

"但为什么...?"

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

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 Browser在YOUR-PC上安装时“启动模式”设置为“手动”,所以无法连接。
  • 我请求您在YOUR-PC上启动SQL Browser服务,您很友好地响应了我的请求,但只是启动了服务并忘记将“启动模式”设置为“自动”。
  • 我能够通过SSMS连接(它在MRU中缓存了YOUR-PC\SQLEXPRESS端口)。我的Python应用程序也可以连接。
  • 在下一次YOUR-PC重新启动后,我可以通过SSMS连接(通过MRU),但我的Python应用程序不能连接(因为SQL Browser服务不再在YOUR-PC上运行)。

3

尝试指定端口:

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)。


4
请注意:Microsoft的ODBC驱动程序不支持在连接字符串中使用PORT=属性来连接SQL Server。要指定端口,必须将其添加到服务器名称/IP地址之后的逗号后面,例如192.168.1.128,1433 - Gord Thompson

1

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

我遇到了同样的错误消息,这个方法解决了我的问题。


我想可能有一些现代SQL Server版本的配置,古老的“SQL Server”驱动程序(设计用于SQL Server 2000及更早版本)可能无法连接。 - Gord Thompson

0

我有一个问题。我可以使用管理工具(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。 列出ODBC的版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接