簡體   English   中英

遠程連接到 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 進行遠程連接時成功的圖像。

在此處輸入圖片說明

“但為什么 ...?”

對於那些對為什么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 Browser 服務按實例名稱成功連接后,即使 SQL Browser 不再在遠程計算機上運行,​​只要端口號未更改,它也可以繼續按實例名稱進行連接。 不使用此 MRU 列表的應用程序(如我們的 pyodbc 應用程序)需要在每次要按實例名稱連接時在遠程計算機上運行 SQL Browser 服務。

最常見的場景:

  • 我想連接到YOUR-PC\\SQLEXPRESS 我嘗試從MY-PC上的 SSMS 執行此操作,但它不起作用,因為 SQL 瀏覽器安裝時在YOUR-PC上將“啟動模式”設置為“手動”。
  • 我要求您在YOUR-PC上啟動 SQL 瀏覽器服務,並且請您遵守,但您只是啟動了該服務而忘記將“啟動模式”設置更改為“自動”。
  • 我能夠通過 SSMS(它在 MRU 中緩存YOUR-PC\\SQLEXPRESS端口)進行連接。 我的 python 應用程序也可以連接。
  • 下次YOUR-PC重新啟動后,我可以通過 SSMS(通過 MRU)進行連接,但我的 python 應用程序不能(因為 SQL Browser 服務不再在YOUR-PC上運行)。

嘗試指定端口:

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

我有相同的錯誤消息,這為我修復了它。

我有這個問題。我可以與 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 。 列出 ODBC 的版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM