首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 2.0 連接 SQL Server 資料庫:SqlConnection 完整解析與連線池最佳實務

     編輯:關於ASP.NET

ADO.NET Connection 物件四大家族

SqlConnection 核心屬性

提供者Connection 類別命名空間適用資料庫
SQL ServerSqlConnectionSystem.Data.SqlClientSQL Server 7.0+
OracleOracleConnectionSystem.Data.OracleClientOracle 9i+
OLE DBOleDbConnectionSystem.Data.OleDbAccess, Excel, 文本...
ODBCOdbcConnectionSystem.Data.Odbc任何支援 ODBC
屬性型別說明
ConnectionStringstring連線參數 (Server, Database, 認證, Pooling 等)
ConnectionTimeoutint連線逾時秒數 (預設 15,唯讀)
Databasestring目前資料庫名稱 (Open 後生效)
DataSourcestring伺服器名稱/實例 (如 .\SQLEXPRESS)
StateConnectionState目前狀態:Open, Closed, Connecting, Executing, Fetching, Broken
ServerVersionstringSQL Server 版本字串 (Open 後)
PacketSizeint網路封包大小 (預設 8192,唯讀,僅 SqlConnection)
CredentialSqlCredential安全認證物件 (避免密碼明文在連線字串)

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;
參數預設說明
Poolingtrue啟用連線池,極大提升效能
Min Pool Size0池中最小保持連線數
Max Pool Size100池中最大連線數,達到上限新請求排隊等待
Connect Timeout15取得連線最長等待秒數
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 與業務邏輯順暢運作。

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