Database 物件提供輕量級 ADO.NET 封裝,簡化 SQL 執行、參數化查詢、連線管理,適合中小型專案快速開發。
| 方法 | 回傳值 | 描述 | 適用場景 |
|---|---|---|---|
| Database.Execute(SQL, params) | Int (影響列數) | 執行 INSERT/UPDATE/DELETE/Stored Procedure | 資料異動操作 |
| Database.GetLastInsertId() | Int/Long | 取得最後插入資料的身分識別欄位值 | 自動遞增主鍵取得 |
| Database.Open(filename) | Database | 開啟資料庫連線 (使用 Web.config 連線字串名稱或 .sdf 檔案路徑) | 建立連線 |
| Database.OpenConnectionString(connStr) | Database | 直接使用連線字串開啟連線 | 動態連線字串 |
| Database.Query(SQL, params) | IEnumerable<dynamic> | 執行 SELECT 查詢,回傳動態物件集合 | 多筆資料讀取 |
| Database.QuerySingle(SQL, params) | dynamic | 查詢單筆資料,無資料回傳 null | 單筆資料讀取 |
| Database.QueryValue(SQL, params) | Object | 查詢單一純量值 (COUNT、MAX、SUM 等) | 統計彙總查詢 |
<connectionStrings>
<add name="DefaultConnection"
connectionString="Data Source=|DataDirectory|\AppData.sdf;Password=secret"
providerName="System.Data.SqlServerCe.4.0" />
<add name="SqlServerConnection"
connectionString="Server=.;Database=MyDb;User Id=sa;Password=pwd;TrustServerCertificate=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
使用方式:var db = Database.Open("DefaultConnection");
// ✅ 正確:參數化查詢
var sql = "SELECT * FROM Products WHERE CategoryId = @0 AND Price > @1";
var products = db.Query(sql, categoryId, minPrice);
// ✅ 正確:具名參數 (較易讀)
var sql = "SELECT * FROM Users WHERE Email = @email AND IsActive = @active";
var user = db.QuerySingle(sql, new { email = "user@example.com", active = true });
// ❌ 錯誤:字串串接 (SQL Injection 風險)
var sql = "SELECT * FROM Users WHERE Email = '" + email + "'";
參數佔位符:@0, @1, @2... (位置) 或 @paramName (具名)。
var sql = @"INSERT INTO Products (Name, Price, CategoryId, CreatedDate)
VALUES (@0, @1, @2, @3)";
var result = db.Execute(sql, "New Product", 299.99, 5, DateTime.Now);
var newId = db.GetLastInsertId();
// 多筆查詢
var products = db.Query("SELECT * FROM Products WHERE CategoryId = @0", catId);
foreach (var p in products) { /* p.Name, p.Price 存取 */ }
// 單筆查詢
var product = db.QuerySingle("SELECT * FROM Products WHERE Id = @0", id);
// 純量查詢
var count = db.QueryValue("SELECT COUNT(*) FROM Products WHERE CategoryId = @0", catId);
var maxPrice = db.QueryValue("SELECT MAX(Price) FROM Products");
var sql = "UPDATE Products SET Price = @0, UpdatedDate = @1 WHERE Id = @2";
var rows = db.Execute(sql, 349.99, DateTime.Now, productId);
var rows = db.Execute("DELETE FROM Products WHERE Id = @0", productId);
Database 物件實作 IDisposable,建議使用 using 區塊確保連線正確釋放:
using (var db = Database.Open("DefaultConnection")) {
var products = db.Query("SELECT * FROM Products");
// 處理資料
} // 自動呼叫 Dispose(),關閉連線回連線池
using (var db = Database.Open("DefaultConnection")) {
db.Execute("BEGIN TRANSACTION");
try {
db.Execute("UPDATE Accounts SET Balance -= @0 WHERE Id = @1", amount, fromId);
db.Execute("UPDATE Accounts SET Balance += @0 WHERE Id = @1", amount, toId);
db.Execute("COMMIT");
} catch {
db.Execute("ROLLBACK");
throw;
}
}
或使用 System.Transactions.TransactionScope 進行分散式交易。