All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
PHP中的正则表达式_[PHP教程]
学习:如何在HTML中引用XML数据_[XML教程]
使用C#实现阿拉伯数字到大写中文的转换_[Asp.Net教程]
关于asp.net2.0的导航控件treeview和menu_[Asp.Net教程]
php 截取中文_[PHP教程]
优秀ASP.NET程序员修炼之路_[Asp.Net教程]
简单学习PHP向MYSQL中插入数据的代码_php资料_编程技术
php实现下载功能_php资料_编程技术
PHP实例:PHP和JS实现交互的一个例子_[PHP教程]
用PHP调用Oracle存储过程_[PHP教程]
Reading number is top 10 pictures
如果没有好报,为什么要做好人?
Catch prostitution woman in China
Summer is most suitable for young people to travel in China8
Sell the barbecue as says father du breul2
机器人也有性生活吗?
Sora aoi mirror memorial classics2
赵惟依写真2
Absolutely shocked. National geographic 50 animal photographys10
Sora aoi on twitter2
China's first snake village1
Download software ranking
C#COM编程指南
Boxer's Top ten classic battle2
DreamWeaver8
Professional killers2 for Android
linux高级编程
asp.net技术内幕
Boxer's Top ten classic battle8
尖东毒玫瑰B
Call Of Duty2
WebService在.NET中的实战应用教学视频 → 第4集
归海一刀 published in(发表于) 2014/2/1 0:16:39 Edit(编辑)
SQL查询语句对象化的实现(C#)_[SQL,Server教程]

SQL查询语句对象化的实现(C#)_[SQL,Server教程]

SQL查询语句对象化的实现(C#)_[SQL Server教程]

在开发数据库应用的过程难免会编写大量的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语句的对查询语句的组成部分比较了解。


其中比较难的就是条件部分处理,因为条件的组合是情况是比较多;所以设计起来相对比较复杂。在设计的过程中把条件单独抽取出来,并生成接口对条件的表达式进行描述:


///


/// 表达式描述接口


/// 用于SQL语句条件表达式的描述


///


public interface IExpression


{


///


/// 获取表达式


///


/// 数据处理设备提供者


/// string


string GetFilter(HFSoft.Data.IDriverType driver);


///


/// 获取表达式相关的参数


///


/// 数据处理设备提供者


/// System.Data.IDataParameter[]


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


///


/// 序列标识


/// 本属性用于内部处理


///


string Sequence


{


get;


set;


}


///


/// 添加表达式


///


/// 合并类型(or|and)


/// 表达式对象


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


///


/// 添加表达式


///


/// 表达式对象


void Add(params IExpression[] expressions );



}


在接口描述中有很多地方离不开HFSoft.Data.IDriverType它是用于描述数据库类型。根据HFSoft.Data.IDriverType 对应生成SqlServer,MySql,Oracle等数据库的条件表达式。


为什么IExpression具有Add方法,并且添加的对象也是IExpression;因为条件自己可以包含多个子表达式,只有这样才能够灵活组合成复杂的条件表达式。


接下来看下基于这个接口的实现
///


/// 表达式基础类


///


[Serializable]


public class Expression:IExpression


{


private string mName;


///


/// 获取或设置相关的字段名


///


public string Name


{


get


{


return mName;


}


set


{


mName = value;


}


}


private object mValue;


///


/// 获取或设置相关的字段值


///


public object Value


{


get


{


return mValue;


}


set


{


mValue = value;


}


}


private string mSequence = "";


///


/// 获取或设置相关标识


/// 本属性用于内部处理


///


public string Sequence


{


get


{


return mSequence;


}


set


{


mSequence = value;


}


}


#region IExpression 成员


///


/// 获取表达式


///


/// 数据处理设备提供者


/// string


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


{


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


}


///


/// 获取表达式相关的参数


///


/// 数据处理设备提供者


/// System.Data.IDataParameter[]


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();


///


/// 添加相关表达式


///


/// 表达式对象


public void Add(params IExpression[] expressions )


{


Add(UintType.And,expressions);


}


///


/// 添加相关表达式


///


/// 表达式合并类型


/// 表达式对象


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);


}


}


}


///


/// 获取内部表达式


///


/// 数据设备提供者


/// string


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();


}


///


/// 获以内部表达式的参数值


///


/// 数据设备提供者


/// System.Data.IDataParameter[]


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;下面我们根据这个模板类派生出具体表达式类型。


///


/// 基础表达式抽象类


///


[Serializable]


public abstract class BaseExpression:Expression


{


///


/// 获取表达式参数对象集


///


/// 数据设备提供者


/// System.Data.IDataParameter[]


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));


}


///


/// 获取表达式


///


/// 数据设备提供者


/// string


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();


}


///


/// 表达式类型


/// =,like等


///


/// string


protected abstract string GetCompareType();


}


///


/// 等于表达式


///


[Serializable]


public class EqExpression:BaseExpression


{


///


/// 构造等于表达式对象


///


public EqExpression()


{


}


///


/// 构造指定名称和值的等于表达式对象


///


/// 名称


///


public EqExpression(string name,object value)


{


Name = name;


Value = value;


}


///


/// 表达式比较符


///


/// string


protected override string GetCompareType()


{


return " = ";


}


}


整个条件对象的设计就完成了,文章代码中只有实现了等于的表达式对象;我们可以按自己情况编写更复杂的表达式。条件表达式对象在整个查询对象中是比较核心的部心,因为在整个SQL查询语句中除了这些条件外其它地方都是固定的,剩下的就是把些不同的字符串合并起来,这些东西就不详细说了大家比较了解。


其实Expression只是一个模板类,它自己本生并没有条件处理的能力只是一个简单的1=1;下面我们根据这个模板类派生出具体表达式类型。


///


/// 基础表达式抽象类


///


[Serializable]


public abstract class BaseExpression:Expression


{


///


/// 获取表达式参数对象集


///


/// 数据设备提供者


/// System.Data.IDataParameter[]


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));


}


///


/// 获取表达式


///


/// 数据设备提供者


/// string


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();


}


///


/// 表达式类型


/// =,like等


///


/// string


protected abstract string GetCompareType();


}


///


/// 等于表达式


///


[Serializable]


public class EqExpression:BaseExpression


{


///


/// 构造等于表达式对象


///


public EqExpression()


{


}


///


/// 构造指定名称和值的等于表达式对象


///


/// 名称


///


public EqExpression(string name,object value)


{


Name = name;


Value = value;


}


///


/// 表达式比较符


///


/// string


protected override string GetCompareType()


{


return " = ";


}


}


整个条件对象的设计就完成了,文章代码中只有实现了等于的表达式对象;我们可以按自己情况编写更复杂的表达式。条件表达式对象在整个查询对象中是比较核心的部心,因为在整个SQL查询语句中除了这些条件外其它地方都是固定的,剩下的就是把些不同的字符串合并起来,这些东西就不详细说了大家比较了解。


来源:网络







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.