首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

C# 連接字串中反斜線轉義導致 SQL Server 錯誤 40 的根因與解決

     編輯:關於SqlServer

現象重現

使用 C# (VS2013, .NET 4.0) 連接 SQL Server 2008 命名實例,連接字串寫法:

string connStr = "Server=MyPC\SQL2008;Database=TestDB;Trusted_Connection=True;"

執行 conn.Open() 拋出例外:

System.Data.SqlClient.SqlException:找不到伺服器/實例名稱,或存取被拒絕 (錯誤 40)。

環境說明

  • SQL Server 2008 命名實例,實例名以 t 開頭(如 t_Instance)
  • 連接字串未加 @ 逐字字串前綴

根因分析

C# 字串字面值中 \ 為跳脫字元。\t 被編譯器解析為 水平定位符 (Horizontal Tab, HT, ASCII 9),而非字面反斜線 + t。因此實際傳遞給 SqlClient 的伺服器名稱變成 MyPC[TAB]SQL2008,導致網路名稱解析失敗。

若實例名不以 t, n, r, u, x 等跳脫序列開頭字母開頭,雖然語法正確但語意錯誤(如 \S 仍保留反斜線),容易造成誤以為「有時正常、有時失敗」。

解決方案

方法 1:逐字字串字面值(推薦)

string connStr = @"Server=MyPC\SQL2008;Database=TestDB;Trusted_Connection=True;";

@ 前綴指示編譯器不處理跳脫序列,\ 視為普通字元。

方法 2:雙重反斜線

string connStr = "Server=MyPC\\SQL2008;Database=TestDB;Trusted_Connection=True;";

方法 3:使用 SqlConnectionStringBuilder(最安全)

var builder = new SqlConnectionStringBuilder {
  DataSource = @"MyPC\SQL2008",  // 或 "MyPC\\SQL2008"
  InitialCatalog = "TestDB",
  IntegratedSecurity = true
};
string connStr = builder.ConnectionString;

Builder 會自動處理特殊字元跳脫,並驗證關鍵字拼寫。

最佳實務建議

  1. 養成習慣:所有 Windows 路徑、SQL 連接字串、正則表達式模式字串,一律使用 @ 前綴。
  2. 程式碼審查:對含反斜線的字串字面值加入靜態分析規則(如 Roslyn Analyzer),偵測缺少 @ 或雙反斜線的情況。
  3. 設定檔外部化:連接字串置於 app.config/web.config connectionStrings 區段,XML 中反斜線無需跳脫,消除原始碼層面風險。

延伸:常見跳脫序列速查

序列意義十六進位
\t定位符 (Tab)0x09
\n換行 (LF)0x0A
\r歸位 (CR)0x0D
\uXXXXUnicode 字元-
\xXX十六進位位元組-

若實例名以上述字母開頭,必須處理跳脫,否則編譯通過但運行失敗,極難排查。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved