首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 图形图象-> PHOTOSHOP教程
sql查询语句对象化的实现(c#)_c#应用
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

在开发数据库应用的过程难免会编写大量的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.cnblogs.com/niit007/archive/2006/08/13/475581.html


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·一个通用的JSP分页程序-JSP教程,Jsp/Servlet
·几种上传方法介绍和比较-JSP教程,资料/其它
·photoshop帮你处理照片偏色
·用photoshop elements制作贺卡
·高频开关电源的并联均流系统
·photoshop 简单制作水晶字教程
·ASP.NET 2.0服务器控件与form runat=server标记-.NET教程,Asp.Net开发
·photoshop 简单去网纹法
·晶晶亮 透心凉—用photoshop制作水珠效果
·ASP小偷(远程数据获取)程序的入门教程-ASP教程,数据库相关
最新文章
·b2c独立网店如何推广_营销推广
·google adsense域名保护列表前瞻_网赚技巧
·google adsense 违规行为集_网赚技巧
·优化adsense提高网站收益(一)_网赚技巧
·站长徐得红:提倡人性化的领导_站长访谈
·约翰·多尔:互联网内容仍不够个性化_站长访谈
·助您提升博客浏览量的五大技巧_站长心得
·photoshop模仿龟裂的瓷纹杯_photoshop教程
·2007年,个人站长将何去何从?_站长心得
·解惑:网站是靠什么来赚钱的呢_站长心得
相关主题
  • sql查询like操作数剖析_数据库技巧
  • SQL查询语句对象化的实现(C#)-.NET教程,数据库应用
  • SQL查询语句精华使用简要-数据库专栏,SQL Server
  • SQL查询的分页思路-数据库专栏,SQL Server
  • SQL查询语句精华使用简要-数据库专栏,SQL Server
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭