參考微軟 SqlHelper 模式,封裝連線、命令、交易、資源釋放,提供 IDisposable 模式支援 using 區塊,簡化 ADO.NET 程式碼。
public class DBHelper : IDisposable
{
// 私有欄位
private SqlConnection _conn;
private SqlCommand _cmd;
private bool _disposed;
private int _cmdTimeout = 30;
// 建構子
public DBHelper(string connStr) { ... }
public DBHelper(string connStr, int timeout) { ... }
// 公開方法群
// ExecuteNonQuery / ExecuteScalar / ExecuteDataTable / ExecuteDataReader
// 支援 純 SQL / 參數化 SQL / StoredProcedure 三種重載
// ExecuteTransaction 批次執行
// 靜態輔助
public static SqlParameter MakeInParam(...)
// IDisposable 模式
public void Dispose() { Dispose(true); GC.SuppressFinalize(this); }
protected virtual void Dispose(bool disposing) { ... }
~DBHelper() { Dispose(false); }
}
using (DBHelper db = new DBHelper(Config.ConnStr))
{
// 參數化查詢
int rows = db.ExecuteNonQuery(
"UPDATE Users SET Status=@s WHERE Id=@id",
new[] { DBHelper.MakeInParam("@s", SqlDbType.Int, 1),
DBHelper.MakeInParam("@id", SqlDbType.Int, 100) });
// 交易批次
string[] cmds = { "INSERT ...", "UPDATE ..." };
db.ExecuteTransaction(cmds);
// 資料表
DataTable dt = db.ExecuteDataTable("Users", "SELECT * FROM Users WHERE Age>@age",
new[] { DBHelper.MakeInParam("@age", SqlDbType.Int, 18) });
}
Dispose 關閉並釋放 SqlConnection/SqlCommand。MakeInParam 統一處理 null/DBNull.Value/空字串 → DBNull.Value。ExecuteTransaction 開啟 SqlTransaction,逐條執行,失敗 Rollback,成功 Commit。finally 區塊確保 Command.Dispose()、Parameters.Clear()。CommandTimeout 屬性可調整。DbProviderFactory 支援多資料庫。async/await 非同步方法 (ExecuteNonQueryAsync 等)。DBHelper 以 using 區塊確保資源釋放,統一異常處理、參數建立、交易控制,是傳統 ADO.NET 專案的實用基礎設施。