远程连接到 MS SQL - 使用 pyodbc 时出错与使用 SQL Server Management Studio 时成功
Remote connection to MS SQL - Error using pyodbc vs success using SQL Server Management Studio
我在同一个网络中有一个 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 远程连接成功的图像。
尝试指定端口:
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。
尝试将驱动程序从 'SQL Server' 更改为 'SQL Server Native Client 11.0'。
我收到了同样的错误消息,这为我修复了它。
"But why ...?"
对于那些对 为什么 SQL Server Management Studio (SSMS) 可以连接到 servername\instance
而其他应用程序(如我们的 pyodbc 应用程序)不能,这是因为 SSMS 在
的 Windows 注册表中保留了一个 MRU(最近使用的)端口号列表
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 浏览器服务通过实例名称成功连接,它可以继续通过实例名称连接,即使 SQL 浏览器不再 [=61] =] 在远程机器上,前提是端口号没有改变。不使用此 MRU 列表的应用程序(如我们的 pyodbc 应用程序)每次想要通过实例名称连接时都需要在远程计算机上安装 SQL 浏览器服务 运行。
最常见的场景:
- 我想连接到
YOUR-PC\SQLEXPRESS
。我尝试在 MY-PC
上从 SSMS 执行此操作,但它不起作用,因为 SQL 浏览器安装时 "Start Mode" 设置为 YOUR-PC
上的 "Manual"。
- 我请你在
YOUR-PC
上启动SQL浏览器服务,请你遵从,但你只是启动服务而忘记将"Start Mode"设置更改为"Automatic".
- 我可以通过 SSMS 连接(它在 MRU 中缓存
YOUR-PC\SQLEXPRESS
端口)。我的 python 应用程序也可以连接。
- 下次
YOUR-PC
重新启动后,我可以通过 SSMS(通过 MRU)连接,但我的 python 应用程序不能(因为 SQL 浏览器服务不再 运行 YOUR-PC
).
我有这个 problem.I 可以与 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 数据库,但在其他计算机上。 使用 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 远程连接成功的图像。
尝试指定端口:
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。
尝试将驱动程序从 'SQL Server' 更改为 'SQL Server Native Client 11.0'。
我收到了同样的错误消息,这为我修复了它。
"But why ...?"
对于那些对 为什么 SQL Server Management Studio (SSMS) 可以连接到 servername\instance
而其他应用程序(如我们的 pyodbc 应用程序)不能,这是因为 SSMS 在
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 浏览器服务通过实例名称成功连接,它可以继续通过实例名称连接,即使 SQL 浏览器不再 [=61] =] 在远程机器上,前提是端口号没有改变。不使用此 MRU 列表的应用程序(如我们的 pyodbc 应用程序)每次想要通过实例名称连接时都需要在远程计算机上安装 SQL 浏览器服务 运行。
最常见的场景:
- 我想连接到
YOUR-PC\SQLEXPRESS
。我尝试在MY-PC
上从 SSMS 执行此操作,但它不起作用,因为 SQL 浏览器安装时 "Start Mode" 设置为YOUR-PC
上的 "Manual"。 - 我请你在
YOUR-PC
上启动SQL浏览器服务,请你遵从,但你只是启动服务而忘记将"Start Mode"设置更改为"Automatic". - 我可以通过 SSMS 连接(它在 MRU 中缓存
YOUR-PC\SQLEXPRESS
端口)。我的 python 应用程序也可以连接。 - 下次
YOUR-PC
重新启动后,我可以通过 SSMS(通过 MRU)连接,但我的 python 应用程序不能(因为 SQL 浏览器服务不再 运行YOUR-PC
).
我有这个 problem.I 可以与 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.