完全通過組件對象描述的方式來完成所有數據庫操作是不太現實的事情,所以組件提供SQL和存儲過程的執行支持.隨着組件版本的不斷完善在1.7后組件在使用SQL和存儲也是一件極其方便的事情.其簡潔的操作方式相信在其他數據訪問組件中難以體驗到.
SQL處理
組件提供一個SQL對象用於直接處理SQL語句,由於重寫了運算符,所以對象可以直接通過string來進行初始化.
SQL sql = "delete from employees where employeeid=@p1";SQL是組件1.7開始提供的對象,它提供以下基礎操作方法
- int Execute()
獲取受影響的行數,一般用於執行insert,delete和update時候需要.- T GetValue<T>
獲取查詢結果第一行第一列的值,主要用於執行一此匯總統計,count,sum等- ListFirst<T>
獲取符合查詢的第一條記錄並填充到相應的對象中- List<T>
獲取符合查詢的記錄填充到相應對象中執行刪除數據
SQL sql = "delete from employees where employeeid=@p1"; sql["p1", 11].Execute();執行查詢
sql = "select * from orders where employeeid=@p1 and orderdate >@p2"; var items= sql["p1", 1]["p2", "1996-1-1"].List<Order>();SQL合並操作
sql = "select * from orders where 1=1"; if (from != null) sql = " and orderdate >=@p1" + sql["p1", from.Value]; if (to != null) sql = " and orderdate <=@p2" + sql["p2", to.Value]; items = sql.List<Order>();統計
sql = "select count(*) from orders where 1=1"; if (from != null) sql = " and orderdate >=@p1" + sql["p1", from.Value]; if (to != null) sql = " and orderdate <=@p2" + sql["p2", to.Value]; int count = sql.GetValue<int>();混合條件
由於組件提供基於對象的描述表達,但對於一些復雜的條件其某些字條件用string描述相對來說會更簡單簡潔.
Expression exp = Order.orderDate > "1996-1-1"; exp &= " customerid in(select customerid from customers where country=@p1)"; items= exp["p1", "usa"].List<Order>();
存儲處理
組件支持直接存儲過程執行,而存儲過程的描述基本和表實體描述一樣.以下是一個簡單的存儲過程描述:
[Proc] public class CustOrderHist { [ProcParameter] public string CustomerID { get; set; } }以上對象描述的存儲過程名是CustOrderHist,而存儲帶一個CustomerID的輸入參數.描述存儲只要有兩個Attribute:
- Proc
用於描述一個類和存儲過程的映射,如果不指定Name參數的情況下則用類名稱對應存儲過程名稱.- ProcParameter
用於描述類成員作為存儲過程的參數,如果不指定Name參數的情況則用成員名稱作為參數名;通過Direction屬性來指定參數的類型,默認是輸入類型,如果是輸出類型則存儲過程的返回值會綁定到相關成員中.執行存儲過程:
CustOrderHist cohist = new CustOrderHist(); cohist.CustomerID = "ANATR"; cohist.ExecProc_();也可以根據執行存儲返回一個數據集,以下存儲過程的結果如下:
可以針對相應的字段定義一個對象:
public class CustOrderHistData { public string ProductName { get; set; } public decimal Total { get; set; } }定義后就可以存儲過程返回相應的對象集合.
CustOrderHist cohist = new CustOrderHist(); cohist.CustomerID = "ANATR"; IList<CustOrderHistData> datas = cohist.ExecProcToObjects_<CustOrderHistData>();