| 提供者 | Connection 類別 | 命名空間 | 適用資料庫 |
| SQL Server | SqlConnection | System.Data.SqlClient | SQL Server 7.0+ |
| Oracle | OracleConnection | System.Data.OracleClient | Oracle 9i+ |
| OLE DB | OleDbConnection | System.Data.OleDb | Access, Excel, 文本... |
| ODBC | OdbcConnection | System.Data.Odbc | 任何支援 ODBC |
SqlConnection 核心屬性
| 屬性 | 型別 | 說明 |
| ConnectionString | string | 連線參數 (Server, Database, 認證, Pooling 等) |
| ConnectionTimeout | int | 連線逾時秒數 (預設 15,唯讀) |
| Database | string | 目前資料庫名稱 (Open 後生效) |
| DataSource | string | 伺服器名稱/實例 (如 .\SQLEXPRESS) |
| State | ConnectionState | 目前狀態:Open, Closed, Connecting, Executing, Fetching, Broken |
| ServerVersion | string | SQL Server 版本字串 (Open 後) |
| PacketSize | int | 網路封包大小 (預設 8192,唯讀,僅 SqlConnection) |
| Credential | SqlCredential | 安全認證物件 (避免密碼明文在連線字串) |
SqlConnection 核心方法
| 方法 | 說明 |
| Open() | 建立實體連線 (從連線池取得或新建) |
| Close() | 釋放連線回連線池 (等同 Dispose) |
| CreateCommand() | 建立關聯的 SqlCommand (Connection 自動指派) |
| BeginTransaction() | 啟動本地交易 |
| ChangeDatabase() | 切換目前資料庫 |
| GetSchema() | 取得中繼資料集合 (Tables, Columns, Indexes...) |
連線字串關鍵參數
Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=true;
Pooling=true;Min Pool Size=5;Max Pool Size=100;Connect Timeout=15;
Application Name=MyWebApp;MultipleActiveResultSets=true;
| 參數 | 預設 | 說明 |
| Pooling | true | 啟用連線池,極大提升效能 |
| Min Pool Size | 0 | 池中最小保持連線數 |
| Max Pool Size | 100 | 池中最大連線數,達到上限新請求排隊等待 |
| Connect Timeout | 15 | 取得連線最長等待秒數 |
| Application Name | .Net SqlClient Data Provider | 識別應用程式,方便 SQL Profiler 追蹤 |
| MultipleActiveResultSets (MARS) | false | 單一連線支援多個作用中 DataReader (SQL Server 2005+) |
連線池運作原理
- 依連線字串完全相同 (含大小寫、參數順序) 分組管理池。
Open() 從池取得可用連線;Close()/Dispose() 歸還池中。
- 連線池器定期掃描閒置連線,超過
Load Balance Timeout (預設 4 分鐘) 關閉實體連線。
- 絕對不要 在程式碼中手動管理連線池、或嘗試共用單一 SqlConnection 實例跨請求 (非執行緒安全)。
最佳實務:using 區塊確保釋放
public DataTable GetProducts()
{
const string sql = "SELECT ProductID, ProductName, UnitPrice FROM Products";
using (SqlConnection conn = new SqlConnection(_connStr))
using (SqlCommand cmd = new SqlCommand(sql, conn))
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
DataTable dt = new DataTable();
da.Fill(dt); // 內部自動 Open/Close
return dt;
}
}
using 確保 Dispose() 被呼叫 → Close() → 連線歸還池中。
- 即使發生例外,
finally 區塊 (using 隱含) 也會執行釋放。
連線字串儲存與安全
- 儲存於
web.config <connectionStrings>,不要 硬編碼於程式碼。
- 生產環境必須加密
connectionStrings 區段 (aspnet_regiis -pef)。
- Windows Authentication 免密碼,最安全;SQL Authentication 僅限必要環境。
常見錯誤與解決
| 錯誤 | 原因 | 修正 |
| Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. | 連線洩漏 (未 Close/Dispose)、Max Pool Size 過小、長跑查詢佔用連線 | 檢查 using 區塊、調大 Max Pool Size、優化查詢、啟用 MARS |
| Login failed for user '...' | 認證錯誤、Windows 身分無權限、SQL Authentication 密碼錯誤 | 確認連線字串、SQL Server 登入/使用者/權限、信任關係 |
| A network-related or instance-specific error occurred while establishing a connection | 伺服器名稱錯誤、SQL Browser 服務未啟用、防火牆阻擋 1433/動態埠 | 檢查 Data Source、啟用 SQL Browser、開放防火牆埠 |
| ConnectionString property has not been initialized | 未設定 ConnectionString 即呼叫 Open() | 建構子或屬性指派連線字串 |
進階:非同步開啟連線 (4.5+)
await conn.OpenAsync(cancellationToken);
// 配合 ExecuteReaderAsync 實現完整非同步資料存取
結語
SqlConnection 是 ADO.NET 與 SQL Server 溝通的橋樑。掌握連線字串參數、連線池機制、using 區塊釋放模式、安全儲存與加密、常見錯誤診斷,即能建立穩健、高效、安全的資料庫連線基礎設施,支撐上層 BLL/DAL 與業務邏輯順暢運作。
- 上一篇文章: ASP.NET 2.0 伺服器控制項事件開發:基類事件重寫與自訂事件完整實作指南
- 下一篇文章: 基於 ASP.NET 與 SQL Server 2000 的駕校管理系統網頁設計
Copyright ©
程式碼之家 All Rights Reserved