使用 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)。
t 開頭(如 t_Instance)@ 逐字字串前綴C# 字串字面值中 \ 為跳脫字元。\t 被編譯器解析為 水平定位符 (Horizontal Tab, HT, ASCII 9),而非字面反斜線 + t。因此實際傳遞給 SqlClient 的伺服器名稱變成 MyPC[TAB]SQL2008,導致網路名稱解析失敗。
若實例名不以 t, n, r, u, x 等跳脫序列開頭字母開頭,雖然語法正確但語意錯誤(如 \S 仍保留反斜線),容易造成誤以為「有時正常、有時失敗」。
string connStr = @"Server=MyPC\SQL2008;Database=TestDB;Trusted_Connection=True;";
@ 前綴指示編譯器不處理跳脫序列,\ 視為普通字元。
string connStr = "Server=MyPC\\SQL2008;Database=TestDB;Trusted_Connection=True;";
var builder = new SqlConnectionStringBuilder {
DataSource = @"MyPC\SQL2008", // 或 "MyPC\\SQL2008"
InitialCatalog = "TestDB",
IntegratedSecurity = true
};
string connStr = builder.ConnectionString;
Builder 會自動處理特殊字元跳脫,並驗證關鍵字拼寫。
@ 前綴。@ 或雙反斜線的情況。app.config/web.config connectionStrings 區段,XML 中反斜線無需跳脫,消除原始碼層面風險。| 序列 | 意義 | 十六進位 |
|---|---|---|
| \t | 定位符 (Tab) | 0x09 |
| \n | 換行 (LF) | 0x0A |
| \r | 歸位 (CR) | 0x0D |
| \uXXXX | Unicode 字元 | - |
| \xXX | 十六進位位元組 | - |
若實例名以上述字母開頭,必須處理跳脫,否則編譯通過但運行失敗,極難排查。