「一套代碼跑遍所有數據庫」是美好願景,但現實中:不同 RDBMS 的 SQL 方言、鎖機制、優化器行為、特有功能 (如 SQL Server 的表值參數、Oracle 的包變量) 差異巨大。僅用「共同子集」將放棄 60%+ 的性能優化空間。
| 階段 | 技術棧 | 特點 | 局限 |
|---|---|---|---|
| COM 時代 | ADO + OLE DB/ODBC | 統一對象模型 (Connection/Command/Recordset) | 動態游標、服務端游標導致高並發性能差 |
| .NET 早期 | ADO.NET (DataAdapter/DataSet) | 斷開式架構、XML 序列化、強類型 DataSet | 對象關係阻抗失配、批量更新效率低 |
| 現代 | ADO.NET 專用 Provider + ORM (EF Core/Dapper) | 繞過 OLE DB 直連內核、映射靈活、支援異步/管道 | 需針對各 Provider 微調 |
原則:將 RDBMS 特定代碼封裝在可替換模塊中,核心業務邏輯零感知。
IRepository<T>, IUnitOfWork, IDbContextFactorySqlServerRepository, PostgreSqlRepository 等using 確保命令/讀取器即時釋放| 抽象層級 | 適用場景 | 代表技術 |
|---|---|---|
| 接口抽象 (IDbConnection/IDbCommand/IDataReader) | 極簡依賴、手寫 SQL、微服務側車 | Dapper、原生 ADO.NET |
| Repository/UnitOfWork 模式 | 領域驅動設計、複雜業務不變量 | EF Core、NHibernate |
| 微型 ORM + 查詢構建器 | 性能敏感、SQL 完全控制、輕量映射 | Dapper + SqlKata、Linq2db |