sql查询语句对象化的实现(c#)_c#应用

2008-02-23 05:43:21来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

在研发数据库应用的过程难免会编写大量的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等数据库的条件表达式。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: c#减少图片文档大小和尺寸_c#应用

下一篇: 用c#压缩和修复access数据库_c#应用