Xqk.Data数据框架开发指南:丰富的、灵活的查询方法(第二部分:适应不同数据库系统的查询)
2011-11-06 07:13
936 查看
在上篇文章《丰富的、灵活的查询方法(第一部分)》提到,针对不同的开发任务,Xqk.Data数据框架提供了丰富的、灵活的查询方法,文章还介绍了一些查询方法,在这些方法中,大部分都有一个共同的whereStr参数,该参数用来表明查询条件,即SQL语句中紧跟WHERE关键字的部分。需要注意的是,不同的数据库系统都有一些特定的行为。因此,如果代码要想适应不同的数据库系统,请确保提供的whereStr能在不同数据库系统下都能正确执行,且能够得到相同的结果或行为,或者为不同的数据库系统提供不同的whereStr值。
DbTable<TEntity>类为每个使用whereStr查询方法提供了相应的SqlExpression类型whereExpr参数的重载方法。 如:
public TEntity[] Select(SqlExpression whereExpr);
public TEntity SelectSingle(SqlExpression whereExpr);
public T SelectValue<T>(string fieldname, SqlExpression whereExpr);
public T[] SelectFieldValues<T>(string field, SqlExpression whereExpr);
Xqk.Data框架的SqlExpression类被设计成能适应不同的数据库系统。使用SqlExpression参数能确保代码能在不同数据库系统下都能正确执行,且能够得到相同的结果或行为。
SqlExpression,即SQL表达式。包含3个属性:Operate,Left,Right,对应于SQL表达式的操作符,左操作数和右操作数。
Operate 表示操作符,其类型为SqlExpressionOperate枚举,定义如下:
public enum SqlExpressionOperate
{
And, Or, Not,
Equal, Greater, Lower, NotEqual, NotGreater, NotLower,
Comma, Text,
StartsWith
}
Left表示左操作数,其类型为string,一般是数据列的名称。
Right表示右操作数,其类型为object,一般需要根据操作符来判断。
虽然SqlExpression提供了公共构造函数,但不建议用构造函数来生成SqlExpression实例,而应该使用Xqk.Data数据框架提供的一整套与SQL表达式操作符相对应的静态函数。例如,在第一个例子中,我们可以使用以下的一些查询表达式:
_DbtPerson.Select("ismale=1") //查询所有性别为男性的人
_DbtPerson.Select( SqlExpression.Equal("ismale",1))
_DbtPerson.Select("height>103 and ismale=0") //查询所有身高超过103的女性
_DbtPerson.Select( SqlExpression.And(
SqlExpression.Greater("height",103),
SqlExpression.Equal("ismale",0)
));
看上去,使用SqlExpression比使用string要复杂,但是不要忘了,使用SqlExpression的一个主要目的是为适应不同的数据库系统。下面就以StartsWith表达式为例来说明这个重要的特点。
为了查询数据表中姓“张”的人,在MySQL中我们可以用
instr(`name`,"张")=1; 或 substr(`name`,1,1)="张"
而在SQLite下只能用
substr(`name`,1,1)="张"
在Sql Server中要用
substring(`name`,1,1)="张" 或 charindex("张",name)=1;
所以必须为不同的数据库系统提供不同的whereStr,而使用SqlExpression,则用
SqlExpression.StartsWith("name", "张")
就可以在不同数据库系统中实现查询name列以张开头的记录。
DbTable<TEntity>类为每个使用whereStr查询方法提供了相应的SqlExpression类型whereExpr参数的重载方法。 如:
public TEntity[] Select(SqlExpression whereExpr);
public TEntity SelectSingle(SqlExpression whereExpr);
public T SelectValue<T>(string fieldname, SqlExpression whereExpr);
public T[] SelectFieldValues<T>(string field, SqlExpression whereExpr);
Xqk.Data框架的SqlExpression类被设计成能适应不同的数据库系统。使用SqlExpression参数能确保代码能在不同数据库系统下都能正确执行,且能够得到相同的结果或行为。
SqlExpression,即SQL表达式。包含3个属性:Operate,Left,Right,对应于SQL表达式的操作符,左操作数和右操作数。
Operate 表示操作符,其类型为SqlExpressionOperate枚举,定义如下:
public enum SqlExpressionOperate
{
And, Or, Not,
Equal, Greater, Lower, NotEqual, NotGreater, NotLower,
Comma, Text,
StartsWith
}
Left表示左操作数,其类型为string,一般是数据列的名称。
Right表示右操作数,其类型为object,一般需要根据操作符来判断。
虽然SqlExpression提供了公共构造函数,但不建议用构造函数来生成SqlExpression实例,而应该使用Xqk.Data数据框架提供的一整套与SQL表达式操作符相对应的静态函数。例如,在第一个例子中,我们可以使用以下的一些查询表达式:
_DbtPerson.Select("ismale=1") //查询所有性别为男性的人
_DbtPerson.Select( SqlExpression.Equal("ismale",1))
_DbtPerson.Select("height>103 and ismale=0") //查询所有身高超过103的女性
_DbtPerson.Select( SqlExpression.And(
SqlExpression.Greater("height",103),
SqlExpression.Equal("ismale",0)
));
看上去,使用SqlExpression比使用string要复杂,但是不要忘了,使用SqlExpression的一个主要目的是为适应不同的数据库系统。下面就以StartsWith表达式为例来说明这个重要的特点。
为了查询数据表中姓“张”的人,在MySQL中我们可以用
instr(`name`,"张")=1; 或 substr(`name`,1,1)="张"
而在SQLite下只能用
substr(`name`,1,1)="张"
在Sql Server中要用
substring(`name`,1,1)="张" 或 charindex("张",name)=1;
所以必须为不同的数据库系统提供不同的whereStr,而使用SqlExpression,则用
SqlExpression.StartsWith("name", "张")
就可以在不同数据库系统中实现查询name列以张开头的记录。
相关文章推荐
- Xqk.Data数据框架开发指南:丰富的、灵活的查询方法(第三部分:SqlField)
- Xqk.Data数据框架开发指南:丰富的、灵活的查询方法(第一部分)
- 主流数据库之间对SQL:2003标准的不同实现方法比较(第四部分 查询结果集中间n行数据)
- 第二部分:开发简要指南-第五章 支持不同的Android设备
- 【原创】SSH开发框架中,实现系统启动加载类,读取数据库常用数据进入内存,利用Spring托管,并完成reload功能
- 【MyBatis框架】Mybatis开发dao方法第二部分
- 【MyBatis框架】Mybatis开发dao方法第二部分
- SSH开发框架中,实现系统启动加载类,读取数据库常用数据进入内存,利用Spring托管,并完成reload功能
- 主流数据库之间对SQL:2003标准的不同实现方法比较(第二部分 结果集排序)
- 主流数据库之间对SQL:2003标准的不同实现方法比较(第三部分 前n项(Top-n)查询)
- 【MyBatis框架】Mybatis开发dao方法第二部分
- 主流数据库之间对SQL:2003标准的不同实现方法比较(第六部分 基础数据类型之BOOLEAN)
- Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR一、查询数据集合
- Oracle不同数据库同步Merge方法,可以部分替代高级复制。对小数据量同步问题不大。转载http://blog.chinaunix.net/u1/55091/showart_430716.html
- spring-boot框架开发的系统读取到的数据库数据相差8小时的问题解决
- SSH开发框架中,实现系统启动加载类,读取数据库常用数据进入内存,利用Spring托管,并完成reload功能
- 主流数据库之间对SQL:2003标准的不同实现方法比较(第二部分 结果集排序)
- CoreData和ios开发中的数据库,直接查询模拟器内的sqlite数据
- sql在不同数据库查询前几条数据的方法
- 【MyBatis框架】Mybatis开发dao方法第二部分