亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

SQL查詢語句對象化的實現(C#)

2019-11-18 17:03:56
字體:
來源:轉載
供稿:網友

在開發數據庫應用的過程難免會編寫大量的SQL語句,其中大部份是查詢語句;為不同情況編寫查詢語句是一件很煩瑣的事件。用過hibernate或Nhibernate會了解到把SQL查詢語句對象化后使用起非常方便和快捷;也大大減少在編寫查詢SQL語句所帶來的錯誤等問題。

       前段時間在編寫一個數據處理類的時候同樣遇到這個問題,經過一段時間思考和設計現實現了SQL查詢語句對象化的功能;在這里我把自己小小的成果共享一下。

在講解前先看幾個例子(數據是SQLServer的Northwind)注意:例子中所涉及的除查詢對象化外還包含整個數據處理類的使用,那部分還在設計和完善當中。

 

       1)以上語句是查詢訂單ID為10264的訂單信息

       using(Hfsoft.Data.IDatasession session = HFSoft.Data.DataSessionFactory.OpenSession())

     {

         session.Open();

         HFSoft.Data.QueryCmd query = new QueryCmd("Orders");

         query.ExPReesion.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)以上語句是查詢訂單ID大于10264并且小于10600的訂單信息

       using(HFSoft.Data.IDataSession session = HFSoft.Data.DataSessionFactory.OpenSession())

     {

         session.Open();

         HFSoft.Data.QueryCmd query = new QueryCmd("Orders");

         query.Expreesion.Add(  new HFSoft.Data.LeExpression("OrderID",10264),

                                 new HFSoft.Data.RtExpression("OrderID",10600));

         System.Data.DataSet myDS = session.ExecuteDataSet(query.BuilderCmd(session));

     }

     對象生成的SQL語句:

SELECT * FROM Orders  where  1=1  And (OrderID > @OrderID0) And (OrderID < @OrderID1)

 

4)以上語句是查詢訂單ID大于10264并且小于10600或編號是10601,10602,10605的訂單信息

using(HFSoft.Data.IDataSession session = HFSoft.Data.DataSessionFactory.OpenSession())

{

         session.Open();

         HFSoft.Data.QueryCmd query = new QueryCmd("Orders");

         query.Expreesion.Add(  new HFSoft.Data.LeExpression("OrderID",10264),

                       new HFSoft.Data.RtExpression("OrderID",10600));

         query.Expreesion.Add(HFSoft.Data.UintType.Or,new HFSoft.Data.InExpression("OrderID",new int[]{10601,10602,10605}));

         System.Data.DataSet myDS = session.ExecuteDataSet(query.BuilderCmd(session));       }

對象生成的SQL語句:

SELECT * FROM Orders  where  1=1  And (OrderID > @OrderID0) And (OrderID < @OrderID1) Or (OrderID in (@OrderID20,@OrderID21,@OrderID22))

 

從上面的例子我們可以看到對不同的條件進行數據查詢只是一件很簡單的事情,你并不用為不同的查詢情況寫相應SQL語句。

接下來講術這個查詢對象實現,對象的最終就是把不同字符串并起來生成相應的SQL語句;SQL語句查詢語句主要分為以下幾大部份:獲取的字段,表名稱,條件,排序,分組;了解SELECT語句的對查詢語句的組成部分比較了解。

其中比較難的就是條件部分處理,因為條件的組合是情況是比較多;所以設計起來相對比較復雜。在設計的過程中把條件單獨抽取出來,并生成接口對條件的表達式進行描述:

/// <summary>

     /// 表達式描述接口

     /// 用于SQL語句條件表達式的描述

     /// </summary>

     public interface IExpression

     {

         /// <summary>

         /// 獲取表達式

         /// </summary>

         /// <param name="driver">數據處理設備提供者</param>

         /// <returns>string</returns>

         string GetFilter(HFSoft.Data.IDriverType driver);

         /// <summary>

         /// 獲取表達式相關的參數

         /// </summary>

         /// <param name="driver">數據處理設備提供者</param>

         /// <returns>System.Data.IDataParameter[]</returns>

         System.Data.IDataParameter[] GetDataParams(HFSoft.Data.IDriverType driver);

         /// <summary>

         /// 序列標識

         /// 本屬性用于內部處理

         /// </summary>

         string Sequence

         {

              get;

              set;

         }

         /// <summary>

         /// 添加表達式

         /// </summary>

         /// <param name="unittype">合并類型(or|and)</param>

         /// <param name="expressions">表達式對象</param>

         void Add(UintType unittype,params IExpression[] expressions );

         /// <summary>

         /// 添加表達式

         /// </summary>

         /// <param name="expressions">表達式對象</param>

         void Add(params IExpression[] expressions );

        

     }

 

在接口描述中有很多地方離不開HFSoft.Data.IDriverType它是用于描述數據庫類型。根據HFSoft.Data.IDriverType    對應生成SqlServer,MySQL,Oracle等數據庫的條件表達式。

為什么IExpression具有Add方法,并且添加的對象也是IExpression;因為條件自己可以包含多個子表達式,只有這樣才能夠靈活組合成復雜的條件表達式。

 接下來看下基于這個接口的實現
/// <summary>

     /// 表達式基礎類

     /// </summary>

     [Serializable]

     public  class Expression:IExpression

     {

         private string mName;

         /// <summary>

         /// 獲取或設置相關的字段名

         /// </summary>

         public string Name

         {

              get

              {

                   return mName;

              }

              set

              {

                   mName = value;

              }

         }

         private object mValue;

         /// <summary>

         /// 獲取或設置相關的字段值

         /// </summary>

         public object Value

         {

              get

              {

                   return mValue;

              }

              set

              {

                   mValue = value;

              }

         }

         private string mSequence = "";

         /// <summary>

         /// 獲取或設置相關標識

         /// 本屬性用于內部處理

         /// </summary>

         public  string Sequence

         {

              get

              {

                   return mSequence;

              }

              set

              {

                   mSequence = value;

              }

         }

         #region IExpression 成員

         /// <summary>

         /// 獲取表達式

         /// </summary>

         /// <param name="driver">數據處理設備提供者</param>

         /// <returns>string</returns>

         public virtual string GetFilter(HFSoft.Data.IDriverType driver)

         {

              return " 1=1 " + GetSubString(driver);

         }

         /// <summary>

         /// 獲取表達式相關的參數

         /// </summary>

         /// <param name="driver">數據處理設備提供者</param>

         /// <returns>System.Data.IDataParameter[]</returns>

         public virtual System.Data.IDataParameter[] GetDataParams(HFSoft.Data.IDriverType driver)

         {

              return GetSubParams(driver);

         }

        

         #endregion

         private  System.Collections.ArrayList _Expressions = new System.Collections.ArrayList();

         private  System.Collections.ArrayList _Units = new System.Collections.ArrayList();

         /// <summary>

         /// 添加相關表達式

         /// </summary>

         /// <param name="expressions">表達式對象</param>

         public  void Add(params IExpression[] expressions )

         {

              Add(UintType.And,expressions);

         }

         /// <summary>

         /// 添加相關表達式

         /// </summary>

         /// <param name="unittype">表達式合并類型</param>

         /// <param name="expressions">表達式對象</param>

         public  void Add(UintType unittype,params IExpression[] expressions )

         {

              if(expressions != null)

                   foreach(IExpression exp in expressions)

                   {

                       if(exp != null)

                       {

                            _Units.Add(unittype.ToString());

                            exp.Sequence = this.Sequence +_Expressions.Count;

                            _Expressions.Add(exp);

                       }

                   }

         }

         /// <summary>

         /// 獲取內部表達式

         /// </summary>

         /// <param name="driver">數據設備提供者</param>

         /// <returns>string</returns>

         protected string GetSubString(HFSoft.Data.IDriverType driver)

         {

              if(_Units.Count == 0)

                   return "";

              System.Text.StringBuilder sb = new System.Text.StringBuilder();

              for(int i =0;i< this._Units.Count;i++)

              {

                   sb.Append(" " +this._Units[i] +" ("+ ((IExpression)_Expressions[i]).GetFilter(driver)+")");

              }

              return sb.ToString();

         }

         /// <summary>

         /// 獲以內部表達式的參數值

         /// </summary>

         /// <param name="driver">數據設備提供者</param>

         /// <returns>System.Data.IDataParameter[]</returns>

         protected System.Data.IDataParameter[] GetSubParams(HFSoft.Data.IDriverType driver)

         {

              if(_Expressions.Count ==0)

                   return null;

              if(_Expressions.Count ==1)

              {

                   return ((IExpression)_Expressions[0]).GetDataParams(driver);

              }

              System.Collections.ArrayList lst = new System.Collections.ArrayList();

              foreach(IExpression exp in this._Expressions)

              {

                   System.Data.IDataParameter[] ps = exp.GetDataParams(driver);

                   if(ps !=null && ps.Length >0)

                   {

                       foreach(System.Data.IDataParameter dp in ps)

                       {

                            lst.Add(dp);

                       }

                   }

              }

              Array array = Array.CreateInstance(typeof(System.Data.IDataParameter),lst.Count);

              lst.CopyTo(array);

              return array as System.Data.IDataParameter[];

         }

     }


其實Expression只是一個模板類,它自己本生并沒有條件處理的能力只是一個簡單的1=1;下面我們根據這個模板類派生出具體表達式類型。

/// <summary>

     /// 基礎表達式抽象類

     /// </summary>

     [Serializable]

     public abstract class BaseExpression:Expression

     {

         /// <summary>

         /// 獲取表達式參數對象集

         /// </summary>

         /// <param name="driver">數據設備提供者</param>

         /// <returns>System.Data.IDataParameter[]</returns>

         public override System.Data.IDataParameter[] GetDataParams(HFSoft.Data.IDriverType driver)

         {

              System.Data.IDataParameter p1 = driver.GetParameter(Name+ Sequence,Value);

              return ParamsConcat(new System.Data.IDataParameter[]{p1},GetSubParams(driver));

         }

         /// <summary>

         /// 獲取表達式

         /// </summary>

         /// <param name="driver">數據設備提供者</param>

         /// <returns>string</returns>

         public override string GetFilter(HFSoft.Data.IDriverType driver)

         {

              System.Text.StringBuilder sb = new System.Text.StringBuilder();

              sb.Append(Name);

              sb.Append(GetCompareType());

              sb.Append(driver.FormatNameForParameter(Name + this.Sequence));

              return sb.ToString();

         }

         /// <summary>

         /// 表達式類型

         /// =,like等

         /// </summary>

         /// <returns>string</returns>

         protected abstract string GetCompareType();

 

 

     }

     /// <summary>

     /// 等于表達式

     /// </summary>

     [Serializable]

     public class EqExpression:BaseExpression

     {

         /// <summary>

         /// 構造等于表達式對象

         /// </summary>

         public EqExpression()

         {

         }

         /// <summary>

         /// 構造指定名稱和值的等于表達式對象

         /// </summary>

         /// <param name="name">名稱</param>

         /// <param name="value">值</param>

         public EqExpression(string name,object value)

         {

              Name = name;

              Value = value;

         }

         /// <summary>

         /// 表達式比較符

         /// </summary>

         /// <returns>string</returns>

         protected override string GetCompareType()

         {

              return " = ";

         }

     }

整個條件對象的設計就完成了,文章代碼中只有實現了等于的表達式對象;我們可以按自己情況編寫更復雜的表達式。條件表達式對象在整個查詢對象中是比較核心的部心,因為在整個SQL查詢語句中除了這些條件外其它地方都是固定的,剩下的就是把些不同的字符串合并起來,這些東西就不詳細說了大家比較了解。

 

其實Expression只是一個模板類,它自己本生并沒有條件處理的能力只是一個簡單的1=1;下面我們根據這個模板類派生出具體表達式類型。

/// <summary>

     /// 基礎表達式抽象類

     /// </summary>

     [Serializable]

     public abstract class BaseExpression:Expression

     {

         /// <summary>

         /// 獲取表達式參數對象集

         /// </summary>

         /// <param name="driver">數據設備提供者</param>

         /// <returns>System.Data.IDataParameter[]</returns>

         public override System.Data.IDataParameter[] GetDataParams(HFSoft.Data.IDriverType driver)

         {

              System.Data.IDataParameter p1 = driver.GetParameter(Name+ Sequence,Value);

              return ParamsConcat(new System.Data.IDataParameter[]{p1},GetSubParams(driver));

         }

         /// <summary>

         /// 獲取表達式

         /// </summary>

         /// <param name="driver">數據設備提供者</param>

         /// <returns>string</returns>

         public override string GetFilter(HFSoft.Data.IDriverType driver)

         {

              System.Text.StringBuilder sb = new System.Text.StringBuilder();

              sb.Append(Name);

              sb.Append(GetCompareType());

              sb.Append(driver.FormatNameForParameter(Name + this.Sequence));

              return sb.ToString();

         }

         /// <summary>

         /// 表達式類型

         /// =,like等

         /// </summary>

         /// <returns>string</returns>

         protected abstract string GetCompareType();

 

 

     }

     /// <summary>

     /// 等于表達式

     /// </summary>

     [Serializable]

     public class EqExpression:BaseExpression

     {

         /// <summary>

         /// 構造等于表達式對象

         /// </summary>

         public EqExpression()

         {

         }

         /// <summary>

         /// 構造指定名稱和值的等于表達式對象

         /// </summary>

         /// <param name="name">名稱</param>

         /// <param name="value">值</param>

         public EqExpression(string name,object value)

         {

              Name = name;

              Value = value;

         }

         /// <summary>

         /// 表達式比較符

         /// </summary>

         /// <returns>string</returns>

         protected override string GetCompareType()

         {

              return " = ";

         }

     }

整個條件對象的設計就完成了,文章代碼中只有實現了等于的表達式對象;我們可以按自己情況編寫更復雜的表達式。條件表達式對象在整個查詢對象中是比較核心的部心,因為在整個SQL查詢語句中除了這些條件外其它地方都是固定的,剩下的就是把些不同的字符串合并起來,這些東西就不詳細說了大家比較了解。

http://www.49028c.com/niit007/archive/2006/08/13/475581.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久成人精品| 精品亚洲永久免费精品| 久久国产精品免费视频| 日韩欧美视频一区二区三区| 91经典在线视频| 亚洲精品国产品国语在线| 亚洲精品视频二区| 日本一区二区在线播放| 亚洲美女激情视频| 91精品视频专区| 奇米四色中文综合久久| 国产精品久久久久秋霞鲁丝| 久久久久久久国产精品| 亚洲人成在线电影| 亚洲精品mp4| 7777免费精品视频| 日韩影视在线观看| 精品成人av一区| 亲爱的老师9免费观看全集电视剧| 2019中文字幕免费视频| 欧美日本高清视频| 国产精品美女av| 欧美成人午夜剧场免费观看| 亚洲人线精品午夜| 国产亚洲欧洲高清一区| 亚洲欧美日韩第一区| www.午夜精品| 色视频www在线播放国产成人| 国内揄拍国内精品少妇国语| 欧美一级高清免费播放| 久久久久久999| 亚洲人成在线观看| 日韩麻豆第一页| 浅井舞香一区二区| 日韩欧美一区二区三区| 久久视频这里只有精品| 久久精品视频导航| 国产免费一区二区三区在线能观看| 色噜噜狠狠狠综合曰曰曰| 精品视频一区在线视频| 亚洲精品www久久久| 国产精品欧美激情在线播放| 亚洲欧洲一区二区三区久久| 69视频在线免费观看| 国产精品久久久久久久久粉嫩av| 欧美性猛交xxxx免费看| 91禁国产网站| 中文字幕亚洲一区在线观看| 国产精品久久77777| 日韩在线激情视频| 成人妇女免费播放久久久| 黄色一区二区在线观看| 久久久久久久久久久91| 原创国产精品91| 7777精品久久久久久| 亚洲精品720p| 日韩成人中文电影| 日韩美女免费视频| 91久久精品日日躁夜夜躁国产| 欧美午夜性色大片在线观看| 国产精品av在线播放| 欧美主播福利视频| 国产成人精彩在线视频九色| 欧美高清一级大片| xxxxx成人.com| 国产成人一区二区| 91系列在线观看| 国产97人人超碰caoprom| 在线观看久久av| 久久影视电视剧免费网站清宫辞电视| 中文字幕精品在线| 91精品国产99久久久久久| 色爱精品视频一区| 日韩h在线观看| www.亚洲一二| 精品久久久久久久久中文字幕| 欧美激情videos| 一区二区三区视频免费在线观看| 国产亚洲视频在线观看| 亚洲理论片在线观看| 日日摸夜夜添一区| 美女性感视频久久久| 久久伊人精品天天| 欧美激情高清视频| 欧美理论片在线观看| 欧美日韩国产中文精品字幕自在自线| 国产精品久久电影观看| 日韩欧美在线一区| 欧美日韩国产精品一区二区三区四区| 日韩av免费在线播放| 永久免费看mv网站入口亚洲| 亚洲图片制服诱惑| 国内伊人久久久久久网站视频| 欧美日韩国产丝袜另类| 日韩天堂在线视频| 久久国产精品亚洲| 最新国产成人av网站网址麻豆| 97人洗澡人人免费公开视频碰碰碰| 超薄丝袜一区二区| 亚洲精品久久久久国产| 2021久久精品国产99国产精品| 精品无人区太爽高潮在线播放| 清纯唯美亚洲综合| 午夜精品国产精品大乳美女| 久久精品99国产精品酒店日本| 久久久久免费精品国产| 国产亚洲欧美日韩一区二区| 久久久久中文字幕2018| 亚洲成人久久电影| 成人国产精品久久久久久亚洲| 欧美日韩不卡合集视频| 日韩免费在线电影| 社区色欧美激情 | 国产精品久久久久久久久久ktv| 少妇精69xxtheporn| 国产一区二区三区日韩欧美| 亚洲综合色激情五月| 91日韩在线视频| 亚洲国模精品私拍| 国产亚洲精品久久久久久777| 国产一区香蕉久久| 色偷偷av亚洲男人的天堂| 日本亚洲欧洲色α| 96pao国产成视频永久免费| 国产精品444| 伊是香蕉大人久久| 色青青草原桃花久久综合| 欧美福利小视频| 日韩专区中文字幕| 欧美激情一区二区三级高清视频| 欧美国产视频日韩| 欧美成人免费播放| 亚洲最大福利视频网站| 欧美在线视频观看| 欧美激情视频一区二区三区不卡| 久久久久久国产精品三级玉女聊斋| 在线观看免费高清视频97| 国产色视频一区| 97久久久免费福利网址| 国产精品视频网址| 久久精品久久久久久| 亚洲天堂视频在线观看| 亚洲理论片在线观看| 欧美视频在线免费看| 欧美中文字幕视频在线观看| 国产欧美日韩综合精品| 91精品在线观| 亚洲电影第1页| 欧美精品videos另类日本| 欧美另类极品videosbestfree| 欧美国产日本高清在线| 中文字幕亚洲欧美日韩高清| 亚洲bt天天射| 91青草视频久久| 亚洲区在线播放| 亚洲成人免费网站| 亚洲а∨天堂久久精品9966| 粗暴蹂躏中文一区二区三区| 久久亚洲精品小早川怜子66| 日日骚av一区| 久久精品国产亚洲精品2020| 日韩精品免费看| 久久综合亚洲社区| 亚洲国产精品久久久久秋霞蜜臀|