理解 SQL Server 連接架構對於疑難排解、效能調校、安全性稽核至關重要。從應用程式呼叫 API 到封包流經網路協定,每一層都有關鍵決策點。本文從 ADO/OLE DB 與 ADO.NET 兩大主流存取路徑切入,完整剖析用戶端堆疊。
連接堆疊總覽
應用程式程式碼
│
▼
API / 物件庫層 (ODBC, DB-Library, OLE DB, ADO, ADO.NET)
│
▼
OLE DB 提供者 / .NET 資料提供者 (SQLOLEDB, SQLNCLI, SqlClient)
│
▼
Net-Library (DBNETLIB, DBNMPNTW 等)
│
▼
網路協定 (TCP/IP, Named Pipes, Shared Memory, VIA)
│
▼
SQL Server 伺服器端端點
兩大主流物件庫架構
ADO + OLE DB 架構 (傳統 COM 應用)
- SQLOLEDB:Microsoft 官方 OLE DB 提供者,隨 SQL Server/MDAC 安裝
- 連接字串關鍵字:
Provider=SQLOLEDB
- ADO
Connection 物件 → OLE DB 介面 → SQLOLEDB → Net-Library
透過 ODBC 連接的變體
- ADO → MSDASQL (OLE DB Provider for ODBC) → ODBC 驅動程式 → SQL Server
- 連接字串含
Provider=MSDASQL + ODBC DSN 參考
- 額外轉換層,效能略低,但支援僅有 ODBC 驅動的資料源
ADO.NET 架構 (現代 .NET 應用)
| 提供者 | 命名空間 | 核心類別 | 適用場景 |
| .NET Framework Data Provider for SQL Server (SqlClient) | System.Data.SqlClient | SqlConnection, SqlCommand, SqlDataReader, SqlDataAdapter | 原生、最高效能、完整功能 |
| OLE DB .NET Provider | System.Data.OleDb | OleDbConnection, OleDbCommand... | 需透過 SQLOLEDB 連接 SQL Server,或其他 OLE DB 來源 |
| ODBC .NET Provider | System.Data.Odbc | OdbcConnection, OdbcCommand... | 透過 ODBC 驅動連接,跨平台相容 |
關鍵差異:SqlClient 直接實作 TDS (Tabular Data Stream) 協定,繞過 OLE DB/ODBC 層,延遲最低、功能最完整 (如 SqlBulkCopy、SqlDependency、Table-Valued Parameters)。
Net-Library (網路程式庫) 詳細說明
位於提供者與網路協定之間,負責封裝/解封裝 TDS 封包。SQL Server 2000 支援:
- DBNETLIB (TCP/IP):預設、跨網路、效能佳
- DBNMPNTW (Named Pipes):區域網路、Windows 整合驗證友善
- DBMSSPX (NWLink IPX/SPX):Novell 網路環境 (已淘汰)
- DBMSSOCN (Multiprotocol/RPC):多協定支援 (已淘汰)
- DBMSRPCN (Named Pipes RPC):RPC over Named Pipes
- 共享記憶體:
Local 連接,同機器最高效,無網路開銷
用戶端網路公用程式設定
執行 cliconfg.exe (用戶端網路公用程式) 可:
- 設定預設 Net-Library
- 建立伺服器別名 (指定協定、IP/管道名、連接埠)
- 啟用/停用特定程式庫
連接字串關鍵字對照
| 功能 | OLE DB (SQLOLEDB) | SqlClient | ODBC |
| 伺服器 | Data Source / Server | Data Source / Server | Server |
| 資料庫 | Initial Catalog / Database | Initial Catalog / Database | Database |
| 整合驗證 | Integrated Security=SSPI | Integrated Security=True / Trusted_Connection=Yes | Trusted_Connection=Yes |
| SQL 驗證 | User ID / Password | User ID / Password | UID / PWD |
| 連接逾時 | Connect Timeout | Connect Timeout | LoginTimeout |
| 應用程式名稱 | Application Name | Application Name | APP |
| 連接池 | OLE DB Services | Pooling, Min Pool Size, Max Pool Size | CPTimeout, CPReuse |
疑難排解實務:依層隔離問題
- 應用層:程式碼邏輯、參數綁定、交易範圍
- 提供者層:連接字串錯誤、提供者版本不符、MDAC/驅動程式損毀
- Net-Library 層:協定不支援、別名設定錯誤、共享記憶體僅限本機
- 網路層:防火牆、埠阻擋、DNS 解析、TCP Chimney/Offload 相容性
- 伺服器端點:SQL Server 服務狀態、連接埠監聽、錯誤日誌、最大連接數
現代化建議
- 新專案**強制使用 SqlClient** (
System.Data.SqlClient 或 Microsoft.Data.SqlClient)
- 連接字串集中管理 (設定檔、Key Vault、Secret Manager)
- 啟用連接池 (預設開啟),正確關閉/釋放連接 (
using 區塊)
- 設定
Application Name 便於伺服器端識別來源
- 考慮
Encrypt=True;TrustServerCertificate=False 強制 TLS 加密
- 上一篇文章: RDA 實作 SQL Server CE 與桌面版 SQL Server 雙向資料同步
- 下一篇文章: SQL Server 連結 Access 資料庫異構查詢實作指南
Copyright ©
程式碼之家 All Rights Reserved