首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

C# 實作 SQL 查詢物件化:QueryCmd 設計與應用

     編輯:MySQL 資料庫相關知識

動機

資料庫應用開發中需撰寫大量 SQL 查詢,手寫易出錯且難維護。參考 Hibernate/Nhibernate 將查詢物件化,大幅提升開發效率與程式碼品質。

核心類別架構

  • QueryCmd:查詢命令物件
  • Expression 派生類:EqExpression、LeExpression、RtExpression、InExpression 等
  • UintType:邏輯運算子(And/Or)
  • IDataSession / DataSessionFactory:資料存取會話

實戰範例

範例 1:單一條件查詢

using (HFSoft.Data.IDataSession session = HFSoft.Data.DataSessionFactory.OpenSession()) {
    session.Open();
    HFSoft.Data.QueryCmd query = new QueryCmd("Orders");
    query.Expression.Add(new HFSoft.Data.EqExpression("OrderID", 10264));
    System.Data.DataSet myDS = session.ExecuteDataSet(query.BuilderCmd(session));
}

生成 SQL:

SELECT * FROM Orders WHERE 1=1 AND (OrderID = @OrderID0)

範例 2:範圍查詢

query.Expression.Add(
    new HFSoft.Data.LeExpression("OrderID", 10264),
    new HFSoft.Data.RtExpression("OrderID", 10600)
);

生成 SQL:

SELECT * FROM Orders WHERE 1=1 AND (OrderID > @OrderID0) AND (OrderID < @OrderID1)

範例 3:複合條件(範圍 + IN 列表 + OR 邏輯)

query.Expression.Add(
    new HFSoft.Data.LeExpression("OrderID", 10264),
    new HFSoft.Data.RtExpression("OrderID", 10600)
);
query.Expression.Add(
    HFSoft.Data.UintType.Or,
    new HFSoft.Data.InExpression("OrderID", new int[] { 10601, 10602, 10605 })
);

生成 SQL:

SELECT * FROM Orders WHERE 1=1 
  AND (OrderID > @OrderID0) AND (OrderID < @OrderID1) 
  OR (OrderID IN (@OrderID20, @OrderID21, @OrderID22))

優勢總結

  • 型別安全:編譯期檢查欄位名、資料型別
  • 防止 SQL Injection:參數化查詢自動處理
  • 可讀性高:條件邏輯以物件結構表達
  • 易維護:修改條件只需調整物件屬性
  • 跨資料庫:理論上可支援多種資料庫方言

架構設計重點

  1. Expression 抽象基類:定義 ToSql()、GetParameters() 介面
  2. QueryCmd.BuilderCmd():遍歷 Expression 樹組裝完整 SQL 與參數集合
  3. 參數化處理:自動產生 @ParamName 並對應值
  4. 邏輯運算子支援:And/Or 串聯多重條件

完整原始碼與擴充功能(Join、GroupBy、OrderBy、分頁)正在持續完善中,歡迎交流討論。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved