概念

以前一篇文章中,描述了实体Entity的操作,很明显,仅仅实体的操作是远远不够的。如:我们经常会根据查询条件从数据库中获取记录集并绑定到DataGrid上,会根据条件进行批量的Update和Delete,为此,在SPL引进了Criteria(标准)的概念,那么在SPL中设计了三种Criteria:

RetrieveCriteria(获取标准)

这个标准是根据查询条件,排序方式来获取满足条件的数据,可以以DataTable 、实体集的方式来返回。此标准会生成”Select * from TBwhere … order …”语句执行

UpdateCriteria(更新标准)

这个标准是根据条件对一个表进行批量更新,最终会生成”Update TBset … where ..”语句执行

DeleteCriteria(删除标准)

这个标准是根据条件对一个表进行批量删除,最终会生成”Deletefrom TB where …”语句执行

这些标准都是针对单一实体,也就是针对一个表的操作,当然对于Update和Delete来说,这些操作已经足够了,可对于Select来说,我们经常会多表查询,所以,关于这种联合查询将会在下一篇的”高级查询篇”中讲解。

RetrieveCriteria 获取标准

这个RetrieveCriteria是针对单一实体的查询,可以定义查询条件,排序方式并以不同的结果返回出来,下面我举一个例子:我们查询二年级的姓刘的学生号p dentEntityria rc=new RetrieveCriteria();,并以学号升序排

RetrieveCriteria rc=newRetrieveCriteria(typeof(StudentEntity)); //实例化

Conditionc=rc.GetNewCondition();  //实例化一个条件

c.AddEqualTo(StudentEntity.__GRADE,2);   //二年级条件

c.AddMatchPrefix(StudentEntity.__Name,’刘’); //匹配’刘’字开头

c.OrderBy(StudentEntity.__NO);             //按学号排

DataTable dt=rc.AsDataTable();              //以DataTable方式返回

步骤分析:

1.      实例化一个RetrieveCriteria时要指明是哪个实体类,使用“typeof(实体类名)”

2.      New一个Condition(条件),可以使用此方法New出多个Condition,多个Condition之间是”OR”的关系

3.      给Condition指定条件,比如使用AddEqualTo(相等)、AddMatchPrefix(前匹配),关于Condition将会专门进行介绍

4.      使用OrderBy()方法指定排序方式,默认为升序,如果要以降序排序使用:OrderBy(StudentEntity.__NO,false)

5.      最后以AsDataTable的方式返回DataTable,这可以方便进行DataGrid的数据绑定

多种返回方式

        例子中是采用DataTable进行返回,这也是平时最常用的,SPL中还提供了其他的几种方式:

EntityContainer 实体集

这是指返回结果以实体的集合方式体现,对于实体集的操作是非常简单的:

EntityContainerec=rc.AsEntityContainer();

for(int i=0;i<ec.Count;i++)

{

StudentEntity student=(StudentEntity)ec[i];

Stu.Age;

…..//得到实体后可以进行自己的操作

}

Return stu;

ObjectCursor 游标

     SPL也提供游标的方式返回,这与实体集是差不多的概念,这是对原版本的兼容保留:

ObjectCursoroc=rc.AsObjectCursor();

if(oc.HasObject())

{

StudentEntitystudent=(StudentEntity)oc.NextObject();

…. //得到实体后可以进行自己的操作

}

在以游标返回后,进行操作前,一定要以HasObject()进行判断,以免抛出异常

EntityObject单实体

SPL在2.0中增加了以EntityObject单实体的返回方式,大家觉得奇怪了,RetrieveCriteria是返回多记录的,这个单实体是何意了。我们有时候会遇到一种情况,通过”侯选主键”来进行查询,所谓”侯选主键”就是非主键,但可以确定也是唯一的,比如学生表中的学号,但在数据表中学号不是主键,不能用Entity自动的Retrieve()方式来获取,而要使用RetrieveCriteria获取,所以可以确信是唯一记录的,可以使用单实体返回:

EntityObjecteo=rc.AsEntity();

if(eo!=null)

{

StudentEntity student=(EntityObject)eo;

…. //得到实体后可以进行自己的操作

}

其实这种方式是取第一条信息并自动转换成EntityObject方式了,所以如果是多条记录的话,用这种可以取到第一个实体。

TOP功能

在SPL2.0中增加了Top功能,我们只要使用:

RetrieveCriteria rc=newRetrieveCriteria(typeof(StudentEntity));

rc.Top=20;

这样就会只返回符合条件的前20条

目前此功能只支持SQL、ACCESS,因为这是使用”Select top n…”的语句,而ORACLE的TOP功能比较麻烦,尤其是在排序后进行前N条返回,由于时间与测试环境问题,一直没有对ORACLE支持。

多帐套功能

这也是SPL2.0的新增功能,只要指定数据源名就可以,有两种方式:

RetrieveCriteria rc=newRetrieveCriteria(typeof(StudentEntity),”DB2”);

或者:

RetrieveCriteira rc=newRetrieveCriteria(typeof(StudentEntity)):

rc.DatabaseName=”DB2”;

这样就可以对指定的数据源进行操作,而不是默认数据源。

其他

Clear()方法可以清除所有的Condition

SqlString属性可以返回执行的标准SQL语句

同样支持内存存储,这对开发员是透明的,只要实体在XML文件中声明为IsSaveToMemory=true

UpdateCriteria 更新标准

更新标准是针对单一实体根据条件进行批量更新,下面我举个例子:把所有二年级的学生升级为三年级

UpdateCriteria uc=newUpdateCriteria(typeof(StudentEntity)); //实例化

Condition c=uc.GetNewCondition();    //实例化一个条件

c.AddEqualTo(StudentEntity.__GRADE,2);   //指定二年级的学生

up. AddAttributeForUpdate(StudentEntity.__GRADE,3);   //更新为三年级

try

{

int re=uc.Perform();                         //执行,返回影响条数

if(re>0)                                 //如果影响了数据库

Response.Write(“更新影响了”+re.ToString()+”条记录”);

else                              //未影响数据库

Response.Write(“没有更新记录”);

}carth(PlException exp)               //捕捉异常

{

if(exp.ErrorType==ErrorTypes.RestrictError)  //如果是级联更新约束异常

Response.Write(“遇到级联更新约束异常”);  //友好提示

else

throwexp;                          //抛出异常

}

步骤分析:

1.       实例化一个UpdateCriteria时也要指明是哪个实体类型的

2.       创建一个Condition,同样可以New多个Condition,Condition之间是“OR”的关系

3.       使用AddAttributeForUpdate(字段名key,值value)来指定要把某字段更新为某值,可以Add多个,由于时间问题,目前SPL2.0还不支持“字段之间更新”

4.       调用Perform()执行,会返回影响条数,如果没有AddAttributeForUpdate,即没有设定要更新的列,那么返回0

5.       在招待中会抛出级联约束异常,可以捕捉后进行友好提示

多帐套功能

更新标准也支持多帐套功能,使用方式与RetrieveCriteria类似:

UpdateCriteriauc=new UpdateCriteria(typeof(StudentEntity),”DB2”);

或者:

UpdateCriteriauc=new UpdateCriteria(typeof(StudentEntity));

uc.DataBaseName=”DB2”;

这样就可以在指定的数据源里更新数据了。

SqlString属性可以返回执行的SQL语句,以便调试语句。

支持内存存储,也就是如果实体为内存存储的,那么在执行Update后,会自动更新内存,对开发员透明

支持事务处理

 

DeleteCriteria 删除标准

删除标准是根据条件对数据表进行批量删除,值得提醒的话,这个标准使用要非常谨慎,利用不当误删除数据的。例如:要删除所以四年级的学生

DeleteCriteriadc=new DeleteCriteria(typeof(StudentEntity));

Conditionc=dc.GetNewCondition();    //实例化条件

c.AddEqualTo(StudentEntity.__GRADE,4);   //设定条件为GRADE=4

try

{

int re=dc.Perform();  //返回执行的行数

if(re>0)

Response.Write(“成功删除”+re.ToString()+”条记录”);

else

Response.Write(“没有删除记录”);

}catch(PlExceptionexp)

{

if(exp.ErrorType==ErrorTypes.RestrictError) //约束异常

Response.Write(“遇到级联删除约束异常”);

else

throw exp;

}

步骤分析:

1.       实例化删除标准,需要指定实体类型

2.       创建删除条件,可以New多个条件,也是“OR”的关系

3.       调用Perform()执行,返回影响条数

4.       捕捉级联删除约束异常,友好提示

 

多帐套功能

这与其他的标准一样,有两种方式:

DeleteCriteria dc=newDeleteCriteria(typeof(StudentEntity),”DB2”);

或者:

DeleteCriteria dc=newDeleteCriteria(typeof(StudentEntity));

dc.DatabaseName=”DB2”;

这样就可以对指定的数据源进行删除

SqlString属性可以返回执行的SQL语句,以便调试语句。

支持内存存储,也就是如果实体为内存存储的,那么在执行Delete后,会自动更新内存,对开发员透明

支持事务处理

总结:

对于这些标准操作都有一个共同点,就是都针对单一实体,都支持多帐套功能,都支持内存存储功能;不同的是RetrieveCriteira可以以多种方式返回,而且这样的单一实体查询对于系统业务来说还是远远不够的,因此对于查询,将后在后面介绍Query类的联合查询功能,而对于UpdateCriteria和DeleteCriteria来说,这些操作已经足够了,当业务比较复杂的情况下,都可以拆解成这些方式来实现。

关于Condition的细节和事务处理将在后面单独进行讲解。

[置顶] SPL讲解(4)--Criteria操作篇的更多相关文章

  1. [置顶] SPL讲解(7)--Query高级篇

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

  2. [置顶] SPL讲解(6)--Condition篇

    SmartPersistenceLayer 2.0 之 Condition篇 原理        强大的Condition功能是SPL的一个特性,可以使用Condition完成绝大部分的条件定义,使用 ...

  3. [置顶] mmog游戏开发之业务篇

    这周不是很忙,因为我们的游戏开发了近一年,由于公司的业务调整,在游戏开第二服的时候,老板果断的把项目停到了. 感觉超级的不爽啊.因为这个游戏项目像我的孩子一样和我一样成长,里边的大概的业务逻辑都是偶实 ...

  4. [置顶] c#对于文件的操作

    在system.iO:命名空间中提供了两种遍历枚举文件夹的类,Directory 和DirectoryInfo, 他们都有一个方法GetDirectories():来便利枚举文件夹, /// < ...

  5. [置顶] Android中使用sqlite3操作SQLite

    SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 一.创建数据库:  1.将sqlit ...

  6. vue 通过自定义指令实现 置顶操作;

    项目需求:要求当前项目每个页面滑到超出一屏的距离时,出现 backTop 按钮,点击则回到最顶端:俗称置顶操作: 因为涉及到的页面较多,每个页面都加肯定显得重复累赘,最终想到了 Vue 的自定义指令  ...

  7. jQuery操作table数据上移、下移和置顶

    jQuery 操作table中的tr换行的步骤如下: 1.获取当前tr var $tr = $(this).parents("tr"); 2.移动tr //上移 $tr.prev( ...

  8. 006PHP文件处理—— 目录操作 删除目录 删除置顶类型文件

    <?php /** * 目录操作 删除目录 删除置顶类型文件 */ //echo rmdir('61') or die('目录删除失败'); //删除一个目录中有其他文件的内容的方法: //第1 ...

  9. [知了堂学习笔记]_css3特效第二篇--行走的线条&&置顶导航栏

    一.行走的线条. 效果图(加载可能会慢一点儿,请稍等...): html代码: <div class="movingLines"> <img src=" ...

随机推荐

  1. Linux下串口编程入门

    简介: Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍. 串口简介  串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用 ...

  2. 发几个速度快可以用的google IP,谷歌IP(转)

    google搜索引擎打不开时的解决办法,谷歌(google)的IP是多少? google IP镜像. 这里搜集了几个经过测试可用的IP,用来在不能域名访问google的时候进行访问,实时更新! 前面几 ...

  3. 【shell】构造并遍历二位数组的一种用法

    参考shell数组的部分操作用法,实现了构造和遍历二维数组的一种方式,具体如下: #数组元素以空格分割 sites=("www.a.com www.b.com www.c.com www.d ...

  4. SharePoint excel service web part 连接到 filter web part

    本文讲述SharePoint excel service web part 连接到 filter web part的一个简单应用场景. SharePoint excel service web par ...

  5. spring mvc 安全

    1,使用 spring form 标签 防 csrf 攻击 2,标明请求方法:RequestMethod.GET,RequestMethod.POST, PATCH, POST, PUT, and D ...

  6. 一个用 Cumulative Penalty 培训 L1 正规 Log-linear 型号随机梯度下降

      Log-Linear 模型(也叫做最大熵模型)是 NLP 领域中使用最为广泛的模型之中的一个.其训练常採用最大似然准则.且为防止过拟合,往往在目标函数中增加(能够产生稀疏性的) L1 正则.但对于 ...

  7. IOS上 关于状态栏的相关设置(UIStatusBar)

    知识普及 ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时间等部分: 背景部分:就是显示黑色或者图片的背景部分: 如 ...

  8. [CSAPP笔记][第一章计算机系统漫游]

    计算机系统漫游 我们通过追踪hello程序的生命周期来开始对系统的学习—–从它被程序员创建,到系统上运行,输出简单的消息,然后终止.我们沿着这个程序的生命周期,简要介绍一些逐步出现的概念,专业术语和组 ...

  9. simplify the life ECMAScript 5(ES5)中bind方法简介

    一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...

  10. Day_8.《无懈可击的web设计》-巧妙地浮动效果

    > 本章内容略显陈旧,主要描述如何用浮动替代表格布局,并没有什么出彩的地方.不过其间提到了清楚浮动的几种方法,那么今天就总结一下如何清楚浮动吧. #### 为什么要清除浮动?虽说是清除浮动,其实 ...