分享
 
 
 

SmartPersistenceLayer 2.0(7) --Query高级查询篇

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

SmartPersistenceLayer 2.0 之Query高级查询篇

总述

在看了前面的功能后,大家都会考虑到多表之间的查询怎么办.在这里,我想先讲一下查询在应用系统中的复杂性/重要性/可行性.

重要性:查询统计是系统维护的一个目标之一,是系统的一个必不可少的部分,因此,在绝大部分的系统中,都会有查询统计。

复杂性:查询是在系统开发中一个最复杂的部分,谁都无法预料查询统计的复杂性,哪怕是在一个小型系统中,因此,在SPL中也是无法实现这么多的查询统计,为了兼容,SPL也努力实现了它所能做的,就是”联合查询”功能,将通过Query类来完成.

可行性:要能快速,有效的应付复杂多变的查询与统计,在我看来,用视图进行处理是一个最有效的方式.一是视图的高速:数据库的视图查询要比执行SQL来的快多,因为数据库会为视图进行缓存.二是开发快速性:写SQL语句需要很多时间,而且查询汇总的语句都是相当复杂的,所以也容易出错,而视图会把问题变的非常简单,开发速度大大提高.三是维护性:由于查询的复杂性,变动频繁将是最明显的特征,所以SQL语句的应变能力没有视图来得好.

因此,我的建议是对于一些查询与统计,我们应尽可能的采用视图来做.简单的查询当然可以使用SQL.现在来介绍SPL中的Query联合查询.

联合查询

例子:A表的ID与B表的AID有关联,我们要关联A/B表,选择A表的NAME和B表的COMPANY值.

Query q1=new Query(typeof(A)); //建一个A表的Query

q1. AddAttribute(A.NAME); //添加一个要选择的字段

Condition c=q1. GetQueryCondition(); //A表产生一个查询

c.AddEqualTo(“Name”,”tintown”); //给A添加条件,请参考Condition

q1.OrderBy(“Name”); //添加一个排序,请参考RetrieveCriteria

Query q2=new Query(typeof(B)); //建一个B表的Query

q2.AddAttribute(B.COMPANY,”公司名”); //添加另一个选择的字段,以别名输出

q1. AddJoinQuery(A.ID,q2,B.AID); //把q1与q2关联起来

DataTable dt=q1. Execute(); //执行查询

步骤分析:

1. Query的创建与Criteira差不多一样的,要指定一个实体类型typeof(A)

2. 由于是多表查询,所以要求设定选择哪些字段,目前SPL中有三种方式:

1. AddAttribute(字段名):这是直接以字段名为输出名

2. AddAttribute(字段名,别名):这是可以把字段名以别名的方式输出

3. AddAttribute(AttributeType.All):这是指以*号的方式全部显示

3. 使用Execute()执行后返回DataTable类型,可以直接绑定用。

在使用这种输出字段时,要注意不能重名输出,尤其是在使用了*号后,因为会正在一些不可预测的字段重名,所以,建议尽可能使用别名

通过以上的方式就可以实现大多数表之间的联合查询.以上有个局限性:表写表之间的关系都是inner join的.也就是无法实现左连接效果,对于这种查询,我还是建议使用视图.

其他的Condition与OrderBy都与RetrieveCriteria类似,不再赘述。

统计查询

对于汇总查询本身也是非常复杂的,SPL也只能实现简单的汇总,对于复杂性的汇总还是建议使用视图或是SQL进行.

Query q1=new Query(typeof(A));

q1.AddAttribute(A.NAME): //显示NAME

q1.SelectMax(A.PRICE,”MAXPRICE”); //统计最高价格,别名MAXPRICE

q1.SelectSum(A.PRICE,”ALLPRICE”); //统计价格总和,别名ALLPRICE

q1.SelectAvg(A.PRICE,”AVGPRICE”); //统计平均价格,别名AVGPRICE

q1.SelectCount(A.NAME,”COUNT”); //统计条数,别名COUNT

q1.GroupBy(A.NAME); //接NAME进行分组

q1. Execute(); //执行

使用SelectMax,SelectSum,SelectAvg,SelectCount进行简单的汇总,上面的例子是显示多汇总值的情况,所以是采用Execute()方法.

SPL还提供了单返回的方式:

Query q=new Query(typeof(A);

q.SelectCount(A.ID);

int re=q. ExecuteScalar();

这可以返回条数,其实在SPL中就是获取第一条记录的第一列值。

SQL语句执行

为了扩展兼容性,还是要提供最基本的SQL语句执行接口,对于一些复杂的语句,可以使用SQL语句的执行来解决,实现的方式也是非常简单:

string sqlString=”select name from A where price>1000”;

Query. ProcessSql(sqlString,”dbName”);

这里的dbName 是指语句针对哪个数据源进行操作,当然要注意的,通过SQL执行返回的字段名,是数据库的实际的字段名了,而不是实体的属性名了。

DISTINCT功能

在SPL中可以使用IsDistinct属性来使用DISTINCT功能,这将最终生成”Select distinct…”的语句。

存储过程

SPL中也同样支持存储过程,我们也可以通过Query的静态类完成:

IDataParameter para=Query.GetParameter("northwind"); //创建一个参数

para.ParameterName="@name1"; //定义参数名

para.Value="f"; //定义参数值

IDataParameter[] paras=new IDataParameter[1]; //定义参数数组

paras[0]=para; //给数组赋个参数

DataTable dt=Query.RunProcedure("test",paras,"northwind"); //执行存储过程

步骤分析:

1. 可选的设定存储过程参数,可以使用Query的GetParameter()来创建一个Parameter,定义参数名和参数值

2. GetParameter(“数据源名”)会根据数据源的类型自行产生相应的Parameter的,如:数据源为SQL的,则产生SqlParameter,如果是其他的则产生OleDbParameter;也可以通过GetParameter(“数据源名”, “参数名”,参数值)来直接赋参数名与参数值。

3. 定义参数数组,把参数加到数组里

4. 执行Query的RunProcedure(“存储过程名”,参数数组,数据源名),这样就可以获取DataTable了。

如果是不返回DataTable的存储过程,我们可以采用:

int Query. RunProcedure(“存储过程名”,参数数组,out 影响行数,数据源名);

此方法会返回影响的行数,以Out的方式传出;方法直接返回的Int为,存储过程的返回值。

总结

对于Query来说,他的联合查询功能也是非常有限,因此,如果是简单联合查询可以通过Query实现,可要是太复杂的,请在数据库里创建视图,然后使用Query的执行SQL语句的功能来实现。因为再复杂的东西,如果让SPL来实现的,其过程也会变的复杂,而这种复杂还不如使用SQL那样透明。

听棠

2004年11月

MSN:tintown_liu@hotmail.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有