Windows Server 2008 R2 內建防火牆預設啟用、SQL Server 2005/2008 安裝後預設僅啟用 Shared Memory 協定、TCP/IP 連接埠可能非 1433、具名執行個體需 SQL Server Browser 服務等因素,常導致「無法連接到伺服器、錯誤 40/53/26」等連線失敗。本文系統整理從服務、協定、防火牆、連線字串、驗證模式到用戶端驅動的完整排查流程。
services.msc,確認下列服務狀態為 執行中、啟動類型為 自動:常見問題:SQL Server Browser 服務登入帳號權限不足(需本地系統或具網路權限的網域帳號),導致無法回應 UDP 1434 查詢。
TCP Dynamic Ports: [清空]
TCP Port: 1433 (預設執行個體)
或
TCP Port: [自訂靜態連接埠,如 8099] (具名執行個體建議固定)
IP1~IPn(對應伺服器各網卡 IP)同樣設定 TCP Port = 1433、Enabled = Yes。重大陷阱:具名執行個體(SQLEXPRESS)若將 TCP Port 強制設為 1433,可能與預設執行個體衝突導致服務無法啟動(錯誤:The request failed or the service did not respond in a timely fashion)。解決:具名執行個體固定使用非 1433 靜態連接埠(如 8099),並開放防火牆、連線字串指定該連接埠。
SQL Server TCP 1433、SQL Server TCP 8099、SQL Server Browser UDP 1434。進階:限制遠端 IP** 於規則「範圍」頁籤設定「遠端 IP 位址」為應用程式伺服器/管理工作站 IP,提升安全性。
db_datareader、db_datawriter、EXECUTE 權限,避免使用 sa。| 執行個體類型 | 正確連線字串範例 | 關鍵點 |
|---|---|---|
| 預設執行個體 (MSSQLSERVER) | Server=192.168.1.100,1433;Database=MyDB;User ID=app_user;Password=xxx;Encrypt=True;TrustServerCertificate=True; | IP,連接埠格式;預設 1433 可省略連接埠 |
| 具名執行個體 (SQLEXPRESS) | Server=192.168.1.100\SQLEXPRESS;Database=MyDB;User ID=app_user;Password=xxx;Encrypt=True;TrustServerCertificate=True; | 反斜線分隔執行個體名;需 SQL Browser + UDP 1434 |
| 具名執行個體固定連接埠 | Server=192.168.1.100,8099;Database=MyDB;User ID=app_user;Password=xxx;Encrypt=True;TrustServerCertificate=True; | 直接指定連接埠,不依賴 SQL Browser,最穩定 |
| 本機連線 (Shared Memory) | Server=.;Database=MyDB;Trusted_Connection=True; | 點號代表本機;Windows 整合驗證 |
| 本機具名執行個體 | Server=.\SQLEXPRESS;Database=MyDB;Trusted_Connection=True; | 本機具名執行個體 |
Server=.\SQLEXPRESS 在 C# 字串中需寫 Server=.\\SQLEXPRESS 或 Server=@".\SQLEXPRESS"(反斜線跳脫)。Data Source 而非 Server 同義,但 Server 較短。TrustServerCertificate=True 否則會報「憑證鏈不受信任」。MDAC / SQLOLEDB 不支援新加密協定、新資料型別(date/time/datetime2/geography 等)。Provider=SQLNCLI11 或 Driver={ODBC Driver 17 for SQL Server}。. 或 .\SQLEXPRESS,Windows 驗證。成功 → 服務、資料庫正常;失敗 → 檢查服務、錯誤日誌。sqlcmd -S 127.0.0.1,1433 -U sa -P xxx -Q "SELECT 1"。成功 → TCP 協定、連接埠、防火牆本機回環正常;失敗 → 檢查 Configuration Manager TCP/IP、防火牆輸入規則。telnet 192.168.1.100 1433portqry -n 192.168.1.100 -p TCP -e 1433portqry -n 192.168.1.100 -p UDP -e 1434(具名執行個體)。MSSQL\Log\ERRORLOG 搜尋 "Login failed"、"Error: 18456"、"Error: 40"、"Error: 53",依錯誤碼精準定位:@echo off
set SERVER=192.168.1.100
set PORT=1433
set INSTANCE=SQLEXPRESS
set USER=app_user
set PASS=xxx
echo 1. Telnet Port...
telnet %SERVER% %PORT%
echo 2. sqlcmd IP,Port...
sqlcmd -S %SERVER%,%PORT% -U %USER% -P %PASS% -Q "SELECT @@VERSION, DB_NAME()"
echo 3. sqlcmd Named Instance...
sqlcmd -S %SERVER%\%INSTANCE% -U %USER% -P %PASS% -Q "SELECT @@VERSION"
echo 4. PortQry UDP 1434...
portqry -n %SERVER% -p UDP -e 1434
pause
Windows Server 2008 R2 上安裝 SQL Server 2005/2008 連線失敗,**90% 以上集中在:TCP/IP 協定未啟用/連接埠未固定、防火牆未開放 1433/1434/自訂連接埠、SQL Server Browser 服務未啟動、驗證模式非混合模式、連線字串格式錯誤**。依照本文「服務 → 協定 → 防火牆 → 伺服器屬性 → 登入 → 連線字串 → 用戶端驅動」的標準化排查順序,配合錯誤日誌狀態碼判讀,可在最短時間內定位並解決問題。對於生產環境,建議以 **固定連接埠 + IP,Port 連線字串** 替代具名執行個體名稱,移除對 SQL Browser 的依賴,大幅提升連線穩定性與安全性。