設計目標
單一類別封裝 SqlConnection/SqlCommand/SqlDataAdapter 與 OleDbConnection/OleDbCommand/OleDbDataAdapter 兩套 API,透過建構函式參數 isSqlClient 切換提供者,統一對外介面。
核心結構
public class Omnipotence {
private readonly bool _isSqlClient;
private readonly string _connStr;
private SqlConnection _sconn;
private OleDbConnection _oconn;
public Omnipotence(string connStr, bool isSqlClient = true) {
_connStr = connStr; _isSqlClient = isSqlClient;
}
private void Open() { /* 依 _isSqlClient 建立/開啟對應連線 */ }
private void Close() { /* 依 _isSqlClient 關閉對應連線 */ }
private object CreateCommand(string sql, bool isStored, IDataParameter[] pars) { /* 回傳 SqlCommand/OleDbCommand */ }
private object CreateAdapter(object cmd) { /* 回傳 SqlDataAdapter/OleDbDataAdapter */ }
統一執行介面
| 方法 | 用途 | 回傳 |
RunProc(sql, isStored, out int rows) | 執行非查詢 | 影響列數 |
RunProc(sql, isStored, pars, out int rows) | 帶參數執行非查詢 | 影響列數 |
RunProc(sql, isStored, out object scalar) | 執行純量查詢 | 首行首欄 |
RunProc(sql, isStored, pars, out object scalar) | 帶參數純量查詢 | 首行首欄 |
RunProc(sql, isStored, out SqlDataReader) | 讀取器(SqlClient) | DataReader |
RunProc(sql, isStored, out OleDbDataReader) | 讀取器(OleDb) | DataReader |
RunProc(sql, isStored, out DataSet) | 填充 DataSet | DataSet |
RunProc(sql, isStored, pars, out DataSet) | 帶參數填充 DataSet | DataSet |
關鍵實作細節
- 所有
RunProc 內部呼叫 Open() → 執行 → Close(),確保連線及時釋放。
- 參數陣列
IDataParameter[] 由呼叫端建立具體 SqlParameter 或 OleDbParameter,內部逐一 Add。
- DataReader 使用
CommandBehavior.CloseConnection,讀取完畢自動關閉連線。
- 採用
object 裝箱回傳命令/適配器,再由 isSqlClient 判斷拆箱轉型。
使用範例
// SQL Server
var db = new Omnipotence("Server=.;DB=Test;Uid=sa;Pwd=123;", true);
DataSet ds; db.RunProc("SELECT * FROM Users", false, out ds);
// Access / Excel
var db2 = new Omnipotence("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data.mdb", false);
int rows; db2.RunProc("INSERT INTO Log(Msg) VALUES(?)", false, new[] { new OleDbParameter("Msg", "test") }, out rows);
優缺點評析
| 優點 | 缺點 |
| 單一 API 支援多提供者,遷移成本低 | 裝箱/拆箱有微小效能損耗 |
| 連線管理集中,不易洩漏 | DataReader 回傳型別不同,呼叫端需知曉提供者 |
| 參數化查詢統一,防 SQL Injection | 非泛型設計,現代專案建議改用 Dapper/EF Core |
現代替代建議
- Dapper:輕量 Micro-ORM,支援多提供者、高效能、泛型 API。
- Entity Framework Core:完整 ORM,Provider 模式天然支援 SQL Server、SQLite、PostgreSQL、MySQL 等。
- DbProviderFactory:.NET 內建抽象廠模式,比手工裝箱更標準。