DAAB 2.0 緊貼 ADO.NET 2.0:移除 DBCommandWrapper 改用原生 DbCommand、連線字串共用 <connectionStrings> 區段、新增 GenericDatabase 支援任意 Provider。本文詳解配置、核心 API、常用模式與交易處理。
| 項目 | 1.1 版 | 2.0 版 |
|---|---|---|
| 命令物件 | DBCommandWrapper | DbCommand (ADO.NET 2.0 原生) |
| 連線字串 | 獨立存放 | 共用 <connectionStrings> |
| 通用資料庫 | 無 | GenericDatabase 支援 Odbc/OleDb/任意 Provider |
// 1.1
var db = DatabaseFactory.CreateDatabase();
var cmd = db.GetStoredProcCommandWrapper("GetProductsByCategory");
cmd.AddInParameter("CategoryID", DbType.Int32, cat);
var ds = db.ExecuteDataSet(cmd);
// 2.0
var db = DatabaseFactory.CreateDatabase();
var cmd = db.GetStoredProcCommand("GetProductsByCategory");
db.AddInParameter(cmd, "CategoryID", DbType.Int32, cat);
var ds = db.ExecuteDataSet(cmd);
<connectionStrings>
<add name="DataAccessQuickStart"
providerName="System.Data.SqlClient"
connectionString="server=(local)\SQLEXPRESS;database=EntLibQuickStarts;Integrated Security=true" />
</connectionStrings>
<dataConfiguration defaultDatabase="DataAccessQuickStart" />
Database 物件DbCommand (SQL/預存程序)ExecuteReader/ExecuteDataSet/ExecuteNonQuery/ExecuteXmlReader)var db = DatabaseFactory.CreateDatabase();
var cmd = db.GetSqlStringCommand("SELECT CustomerID, Name FROM Customers");
using (var dr = db.ExecuteReader(cmd)) {
while (dr.Read()) Console.WriteLine(dr["Name"]);
}
var cmd = db.GetStoredProcCommand("GetProductsByCategory");
db.AddInParameter(cmd, "CategoryID", DbType.Int32, cat);
var ds = db.ExecuteDataSet(cmd);
var ds = new DataSet();
db.LoadDataSet(cmd, ds, "Products");
var tbl = ds.Tables["Products"];
tbl.Rows.Add(DBNull.Value, "New Product", 11, 25);
tbl.Rows[0]["ProductName"] = "Modified";
var ins = db.GetStoredProcCommand("AddProduct");
db.AddInParameter(ins, "ProductName", DbType.String, "ProductName", DataRowVersion.Current);
db.AddInParameter(ins, "CategoryID", DbType.Int32, "CategoryID", DataRowVersion.Current);
db.AddInParameter(ins, "UnitPrice", DbType.Currency, "UnitPrice", DataRowVersion.Current);
var del = db.GetStoredProcCommand("DeleteProduct");
db.AddInParameter(del, "ProductID", DbType.Int32, "ProductID", DataRowVersion.Current);
var upd = db.GetStoredProcCommand("UpdateProduct");
db.AddInParameter(upd, "ProductID", DbType.Int32, "ProductID", DataRowVersion.Current);
db.AddInParameter(upd, "ProductName", DbType.String, "ProductName", DataRowVersion.Current);
db.AddInParameter(upd, "LastUpdate", DbType.DateTime, "LastUpdate", DataRowVersion.Current);
int rows = db.UpdateDataSet(ds, "Products", ins, upd, del, UpdateBehavior.Standard);
var cmd = db.GetStoredProcCommand("GetProductDetails");
db.AddInParameter(cmd, "ProductID", DbType.Int32, id);
db.AddOutParameter(cmd, "ProductName", DbType.String, 50);
db.AddOutParameter(cmd, "UnitPrice", DbType.Currency, 8);
db.ExecuteNonQuery(cmd);
string name = db.GetParameterValue(cmd, "ProductName").ToString();
decimal price = (decimal)db.GetParameterValue(cmd, "UnitPrice");
var sqlDb = db as SqlDatabase;
var cmd = sqlDb.GetSqlStringCommand("SELECT * FROM Products FOR XML AUTO");
using (var xr = sqlDb.ExecuteXmlReader(cmd)) {
while (!xr.EOF) Console.WriteLine(xr.ReadOuterXml());
}
cmd.Connection?.Close(); // XmlReader 關閉不會關連線
using (var conn = db.CreateConnection()) {
conn.Open();
var tx = conn.BeginTransaction();
try {
db.ExecuteNonQuery(creditCmd, tx);
db.ExecuteNonQuery(debitCmd, tx);
tx.Commit();
return true;
} catch {
tx.Rollback();
return false;
}
}
DatabaseFactory.CreateDatabase():預設資料庫CreateDatabase("name"):具名實例CreateDatabase("name") as SqlDatabase:強型別存取 SQL Server 特有功能 (ExecuteXmlReader)| 方法 | 用途 |
|---|---|
AddInParameter | 輸入參數 |
AddOutParameter | 輸出參數 (需指定大小) |
AddParameter | 雙向參數 |
GetParameterValue | 取得參數值 |
SetParameterValue | 設定參數值 |
選 DAAB 當:需支援多資料庫 (SQL Server/Oracle/其他)、追求程式碼可移植性、希望透過設定檔切換資料庫。
選原生 ADO.NET 當:深度綁定特定資料庫特性 (如 SQL Server Table-Valued Parameters、Oracle 快取)、極致效能調校。