标签:des style blog class code tar
摘要:VB/C#.Net实体代码生成工具(EntitysCodeGenerate)【ECG】是一款专门为.Net数据库程序开发量身定做的(ORM框架)代码生成工具,所生成的程序代码基于OO、ADO.NET、分层架构、ORM及反射+工厂设计模式等。支持.Net1.1及以上版本,可用于Oracle、SqlServer、Sybase、DB2、MySQL、Access、SQLite、PostgreSQL、DM(达梦)、PowerDesigner文件、Informix、Firebird、MaxDB、Excel等和OleDb、ODBC连接的数据库并可自定义,详见文档及安装文件的示例和工具的帮助文档。
关键字: VB/C#.Net实体代码生成工具 实体代码生成工具 EntitysCodeGenerate
预期读者: 软件开发及相关人员
难度等级: 中
当前版本: 4.6
目 录
1 引言
2 内容
2.1 ORM框架的实现:VB/C#.Net实体代码生成工具(EntitysCodeGenerate)
2.2 在开发中的实际应用
2.2.1 单个实体对象的数据库操作
1、获取一个实体对象信息
2、插入一个实体对象信息
3、更新一个实体对象信息
4、保存一个实体对象信息
5、删除一个实体对象信息
6、取得实体映射表数值字段的最大值+1
2.2.2 多个实体对象的数据库操作
1、实体集对象的使用
2、结合事务处理
2.2.3 数据查询(EQL)及通用DML操作
1、 常用实体对象查询
2、 ORM结构化查询
(1)、Select查询
(2)、From连接
(3)、Where语句的Condition条件
(4)、Order By排序功能
(5)、Group By分组条件及排序
(6)、结合事务处理的功能
(7)、自定义分页查询(Skip/Take)
3、Delete删除
4、Update更新
5、Insert插入
2.2.4半自动化Mapping-SQL
1、Mapping-SQL介绍
2、Mapping-SQL使用
2.2.5 DbCore+SQL/存储过程
1、DbCore+SQL
2、DbCore+存储过程
3、DbCore执行SQL/存储过程的快捷用法
2.2.6 Extend辅助扩展功能
1、TableHelp辅助扩展
2、CommonHelp常用方法扩展
2.2.7 ORM的分析及与Xml、JSON、EString的交互
1、ORM的分析
2、与XML的交互
3、与JSON的交互
4、与String(即EString)的交互
2.2.8 LINQ的支持
1、LinqTo Entitys
2.2.9 轻量级日志组件
1、简单日志配置
2、简单日志的使用
3 结束语
4 相关下载地址
1引言
长期以来,大多数项目或产品都使用关系型数据库实现业务数据的存储,这样在开发过程中,常常有一些业务逻辑需要直接用写SQL语句实现,但这样开发的结果是:遍地布满SQL语句。这些藕合性较高的SQL语句给系统的改造和升级带来很多无法预计的障碍。也许说可以使用服务端数据库存储子程序实现,这样只是将这种耦合搬迁到后端,问题依然没有根本解决,服务端驻留过多的存储子程序也消耗着服务器的性能并给多人合作维护和更新部署带来许多障碍。为了提高项目的灵活性,特别是快速开发,ORM是一个不错的选择。举个简单的例子:在使用ORM的系统中,当数据库模型改变时,不再需要理会逻辑代码和SQL语句中涉及到该模型的所有改动,只需要将该模型映射的对象稍作改动,甚至不做改动就可以满足要求。
ORM的全称是ObjectRelational Mapping,即对象关系映射。它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将这些对象组织起来,实现系统业务逻辑的过程。在ORM过程中最重要的概念是映射(Mapping),通过这种映射可以使业务对象与数据库分离。从面向对象来说,数据库不应该和业务逻辑绑定到一起,ORM则起到这样的分离作用,使数据库层透明,开发人员真正的面向对象。下图简单说明了ORM在多层系统架构中的这个作用。
图1 ORM在多层系统架构中的作用
诚然ORM并非是万能的,面对纷繁复杂的业务逻辑,当遇到特别复杂的数据处理及海量数据运算或弥补设计的不足时还应归结到SQL或存储过程来实现才是好的选择,但它却很好地体现了“80/20(或90/10)法则”(也被称为“帕累托法则”),也就是说:花比较少(10%-20%)的力气就可以解决大部分(80%-90%)的问题,这样通过利用ORM框架,我们就仅需要付出极少数时间和精力来解决剩下的少部分问题了,这无疑缩短了整个项目开发的周期,因此快速开发、面向对象和性能优化等必须灵活兼顾才好。ORM产品应当预留适当的接口来做性能优化并对特定功能的补充支持,这样才是一个好的产品,这些该工具都提供了很好的解决方案,下文分别作一简单介绍。
2内容
2.1 ORM框架的实现:VB/C#.Net实体代码生成工具(EntitysCodeGenerate)
好的ORM工具不仅可以帮助我们很好的理解对象,而且工具本身会帮助我们记住字段属性的业务含义并提供辅助应用。基于这个理念,一个基于.Net的ORM工具——VB/C#.Net实体代码生成工具(EntitysCodeGenerate)便应运而生,该工具运行于.Net2.0,适用性广,开发后的代码部署要求不高,在.Net更高版本上也可以很好的运行。
该工具为ORM提供了对象持久化查询和事务处理等功能,包括对象的Insert、Update、Delete、Save、Select等,对象查询提供如GetEntity及构造函数获取对象和实体集信息等。工具职责是从数据库中提取数据模型信息并生成实体类,帮助开发人员快速映射到关系数据库中的业务数据模型,最优化快速开发。目前提供直接从Oracle、SqlServer、Sybase、DB2、Access、MySQL、SQLite、PostgreSQL、DM(达梦)及OleDb、Custom(自定义)类型的数据库和PowerDesigner文件中生成VB/C#.Net代码的支持,可以生成实体和实体集的相关代码,并自动提取表及字段的注释说明和对应的数据类型等信息。
另外所生成的代码文件只需修改数据库连接,即可用于目前市场上支持ADO.NET的各种类型的数据库,如Oracle、SqlServer、Sybase、DB2、MySQL、Access、SQLite、PostgreSQL、DM(达梦)、Excel、Informix、Firebird、MaxDB和OleDb、ODBC连接的数据库等。所生成代码文件的类关系图如下所示:
工具3.x版本之后的实体层代码有个基类(BaseEntity),基类里其实也正是你项目的数据库连接的配置位置,该工具实际开发时的配置其实也就在这里了,默认为生成代码时所填写的数据库连接信息(可手工扩展修改,如从缓存或config配置文件中读取、实现对数据库连接信息的加密/解密等;大多数时候我们只需在GetConnectionString修改数据连接字符串即可):
public classBaseEntity
{
public
static string GetConnectionString()
{
return
"User ID=scott;Password=tiger;Data Source= oracle9";//数据库连接可修改从别处读取
}
public
static DatabaseType GetDatabaseType()
{
return
DatabaseType.Oracle; //数据库连接类型设置也可修改从别处读取
}
……
}
|
这里设置的数据库连接类型及连接字符串是针对该命名空间下的所有实体(最初版本是放在全局设置DbConnectString这个类里面,缺陷是当一个项目有多个数据库时将不好处理;而现在通过使用基类继承及命名空间划分则很容易解决)。
System.Database.DbCore结合实体类可将简单和复杂的数据库操作及事务处理更为方便的实现,下文着重介绍在实际中的应用。
2.2在开发中的实际应用
工具安装后,在生成对应的实体代码后有个“相关配置”文件夹,里面有“配置说明”文档和相关文件,实际使用时只须按“配置说明”文档操作即可。使用该工具开发的项目,可以做到很好的切换到异构数据库,且只需变动数据库连接接口即可(即GetDatabaseType()/GetConnectionString())。同时提供了ORMaping.dll(1.0版本引用),System.Database.dll(2.0/3.x/4.x版本引用)组件;安装目录下有相应的chm格式帮助文档,是对这两个dll单独使用的说明,支持各种类型的数据库访问,并可结合生成的实体操作数据库,提供良好的事务处理等。其中ORMaping.dll支持Oracle;System.Database.dll默认支持Oracle数据库,并可用于SqlServer、Sybase、DB2、MySQL、SQLite、PostgreSQL、Informix、Firebird、MaxDB、DM(达梦)、OleDb、Odbc等。对没有直接提供的数据库可使用OleDb或Odbc连接。工具所生成的代码和提供的文件,都是可选配的,可单独使用也可配置使用。实体代码的生成界面比较简单,如下所示:
这里,只须选择数据库类型、输入正确的数据库连接字符串(Custom(自定义)的数据库类型填写正确的自定义程序集信息)、代码文件的输出目录和代码命名空间即可。实体数据类型以“数据类型映射文件”为准,工具提供了系统默认的类型映射,若有自定义的数据类型,在“数据类型映射文件”里修改,可配置到数据类型的精确刻度。数据类型初始值在“数据类型初始值文件”里修改,没有配置的取.Net默认值。若修改过程中想恢复默认的配置,只须点击右端“生成”按钮即可(注意不同语言的类型定义可能有所差异,注意区分。如:C#的byte[],在VB中的定义为byte())。准备工作做好后,单击“生成代码”按钮即可(若不想全部生成,单击“选择生成”按钮)。生成成功之后按生成配置说明文档的提示,将实体代码文件和基类文件拷贝到指定目录,并按生成代码文件所在“相关配置”目录下的配置说明文档,添加对应dll文件的引用即可。操作简单这里就不在此赘述,下面以C#.Net为例介绍实体对象的数据库操作的工作,因篇幅所限,VB.Net同理对比使用。(注:若想在.Net1.1下使用,请设置只生成实体(前后缀不填),并结合"示例代码"目录下"VS2003.rar"中的LXCT.DbCore.dll使用)
先介绍单个实体类的数据库操作。
2.2.1 单个实体对象的数据库操作
这里以Oracle附带库DEPT为例来做说明,首先做对象的声明
此处以该对象来做阐述。
1、获取一个实体对象信息
实体的操作默认以主键为准,对单个实体信息的获取可简单如下实现:
entity.DEPTNO
= 50;
entity = entity.GetEntity();
|
返回主键字段DEPTNO=50的对象,若数据库中没有对应的记录则返回null。DEPT表的主键字段是DEPTNO,同时对联合主键也是支持的,下文同此;GetEntity同时提供其它指定条件的重载,也可以使用GetEntityByEntityCondition,当指定条件有多个记录符合时只返回首条记录;返回多条记录可使用GetDataTable方法。
在3.3版本之后也可通过多个构造函数来获取单个实体对象的信息等:
DEPT entity =new
DEPT(50); //通过主键字段条件获取实体对象 DEPT entity =new
DEPT("DEPTNO",50); //指定唯一字段条件获取实体对象
DEPT entity =new
DEPT(newstring[] {
"DEPTNO" },new
object[] { 50 });
|
2、插入一个实体对象信息
插入一个对象代码可如下所示:
entity.DEPTNO
= 51;
entity.DNAME
= "DNAME1";
entity.LOC
= "LOC1";
entity.Insert();
|
同时Insert提供多种相应的重载和InsertAll方法;区别是:Insert在插入记录时会比较对象初始的字段值,将与初始值不同的值插入,其余的以表字段的默认方式处理;InsertAll则是插入全部字段,即使是对象的初始值没有改变也会插入。
3、更新一个实体对象信息
更新一个对象代码可如下所示:
entity.DEPTNO
= 51;
entity.DNAME
= "DNAME1";
entity.LOC
= "LOC1";
entity.Update();
|
Update也提供多种相应的重载和UpdateAll方法;区别是:Update在更新记录时会比较对象初始的字段值,将与初始值不同的值进行更新,其余的表字段不更新;UpdateAll则是更新全部字段,即使是对象的初始值没有改变也会将对象的初始值更新到表里。
4、保存一个实体对象信息
保存是该工具新增的功能,即将插入和更新合并为一个保存方法,实体对象会自动根据主键约束解析是插入还是更新,代码如下所示:
entity.DEPTNO
= 51;
entity.DNAME
= "DNAME1";
entity.LOC
= "LOC1";
entity.Save();
|
这里是以主键为准,对多个联合主键也是支持的。保存是按主键判断的(没有主键的须指定约束字段),有就更新,没有就插入新记录。同时Save提供多种重载和SaveAll、SaveByEntityCondition方法,Save和SaveAll区别同插入和更新。
5、删除一个实体对象信息
删除可如下代码所示:
entity.DEPTNO
= 51;
entity.Delete();
|
删除操作默认以主键为准,支持联合主键,同时也提供多种指定条件的重载方法。最后附加说明,实体对象的增删改保存操作都会返回一个int值,该值返回表中记录受影响的行数。
从这些代码可以明显的看到,这里常用的增、删、改、查操作只需简单几句即可实现,少写了很多代码!
6、取得实体映射表数值字段的最大值+1
代码可如下:
int intID = entity.GetInt32MaxID();
|
这里获取实体对象对应表字段默认第一个主键的最大值ID+1,类型为整型,同时提供GetInt?MaxID多种重载,即有整型和长整型及指定字段等重载。
除此之外,还提供了一系列的CRUD扩展方法,如:InsertEx / UpdateEx / SaveEx / DelInsert / DelInsertEx 和 实体集对象的批量操作,如:entitys.ToDataTable / Save /SaveAll/SaveEx/Delete/DelInsert/DelInsertEx/GetMaxValue/GetMinValue/GetAvgValue/GetCount/GetSqlValue/GetSqlDataSet等;详见示例代码和生成的实体代码及相关帮助文档。其中实体集对象的批量操作自动启用事务处理,操作成功统一提交,失败时统一回滚。
本节介绍的都是单实体/表无事务的操作,下节介绍多实体/表及事务处理的操作。
2.2.2 多个实体对象的数据库操作
1、实体集对象的使用
实体集除了提供基本的Add和索引访问方法,同时也提供了相应与数据库操作的方法,如:Save/SaveAll/SaveEx/Delete/DelInsert/DelInsertEx/DelInsertAll/ToXml/ToXml_/FromXml/FromXmlFileToDataTable和实体集对象查询。实体集对象与数据库的操作释义同单个实体,并且会自动启动事务。实体集对象查询是通过实体集构造函数获取多实体对象信息,如:
DEPTS entity =new
DEPTS(true); //获取所有部门信息 EMPS entitys
= new EMPS ("DEPTNO",50) //获取DEPTNO=50所有雇员信息
EMPS entitys1 =new
EMPS(newstring[] {
"DEPTNO" },new
object[] { 50 }); DataTable dtbl = entitys.ToDataTable();//将获取的实体集对象信息转换到数据表DataTable
|
2、结合事务处理
这里简略介绍实体对象结合System.Database.DbCore的事务处理是如何工作的,先看以下代码(可参见安装示例代码System.Database.Demo):
Entitys.Common.LC_WORKTYPE entity=
new Entitys.Common.LC_WORKTYPE();
entity.ID
= 1;
entity.TYPENAME
= "TYPENAME";
string strConnection
= "Password=cc;User ID=cc;Data Source=oracle9";
DbCore dbCore
= new DbCore(DatabaseType.Oracle, strConnection);
dbCore.Open();
dbCore.BeginTransaction();
dbCore.Save(new Entitys.Common.LC_WORKTYPE(), entity);
entity.DESCRIPTION
= "类型描述";
dbCore.Save(new Entitys.Common.LC_WORKTYPE(), entity);
entity.TYPENAME
= "作业类型";
dbCore.Save(new Entitys.Common.LC_WORKTYPE(), entity);
DataSet dst
= dbCore.ExecuteDataSet("select * from lc_worktype");
entity.ID
= 1;
DataTable dt
= dbCore.GetDataTableByEntityKey(entity);
int intRecord
= dbCore.Delete(entity);
dt = dbCore.GetDataTableByEntityKey(entity);
dbCore.CommitTransaction();
dbCore.Close();
|
这里使用另外一个实体LC_WORKTYPE(映射到XX系统的"作业类型"这张表),BeginTransaction()为开始事务的标志;CommitTransaction()为提交当前事务;还一个是RollbackTransaction()表示回滚当前事务,放弃当前所有数据的更改。这样在事务开始和提交或回滚之间可以进行多个实体的操作,并将结果最终一起提交或回滚撤销。这里Save有两个参数第一个是实体对象的初始类用于比较实体的初始值,第二个是要保存的对象,该方法依据主键自动判断是更新还是插入;与Save类似的方法有SaveAll,同时也有重载及SaveEx、Insert、InsertAll、InsertEx、Update、UpdaAll、Update
Ex、Delete、IsExitByEntityKey、Exists、Get?MaxId等方法,可相互结合使用,方法都有详尽的说明及示例代码。执行中可单步跟踪,查看该事务下每步命令执行后对应的数据集信息。
下面再看以Oracle自带的scott库为例一段代码Delete、Insert、Update并结合事务使用的代码:
DbCore dbCore
= null;
try
{
EMP entity1
= new EMP();
DataSet dst
= new DataSet();
entity1.EMPNO
= 7369; //设置主键EMPNO为
entity1 = entity1.GetEntity(); //取得主键EMPNO为实体对象信息
//"User ID=scott;Password=tiger;Data Source=oracle9";
dbCore =
new DbCore(Entitys.Common.BaseEntity.GetConnectionString());
dbCore.Open();
dbCore.BeginTransaction();
//选择当前事务下的所有雇员EMP的信息
dst = dbCore.SelectAll().From(entity1).ExecuteDataSet();
dbCore.Delete(entity1);//删除主键EMPNO为7369的记录
dst = dbCore.SelectAll().From(entity1).ExecuteDataSet();//查看当前事务下记录,当前删除记录将不在此显示
dbCore.Insert(newEMP(), entity1);//插入刚才删除主键EMPNO为7369的记录=dbCore.Save(new
EMP(), entity1);
dst = dbCore.SelectAll().From(entity1).ExecuteDataSet();//查看当前事务下记录,可见刚刚插入的新记录
entity1.SAL
= entity1.SAL + 100;//薪水加100
dbCore.Update(newEMP(), entity1);//更新=dbCore.Save(new EMP(), entity1);
dst = dbCore.SelectAll().From(entity1).ExecuteDataSet();//查看当前事务下记录,对应薪水SAL已更新
entity1.SAL
= entity1.SAL - 100;//薪水减100
dbCore.Update(newEMP(), entity1);//更新=dbCore.Save(new EMP(), entity1);
dst = dbCore.SelectAll().From(entity1).ExecuteDataSet();//查看当前事务下记录,对应薪水SAL已更新
dbCore.CommitTransaction();
dbCore.Close();
}
catch (Exception ex)
{
if (dbCore
!= null)
{
if (dbCore.IsTransaction)
dbCore.RollbackTransaction();//如果已经开始事务,则回滚事务
dbCore.Close();
}
}
|
上面的Insert、Update方法都可以Save方法来取代,Save方法会自动判断是Update还是Insert,这里只是用来展示之用。
2.2.3 数据查询(EQL)及通用DML操作
如一般的关系数据库所具有的查询功能一样,EntitysCodeGenerate也有着非常丰富的查询功能,如对象查询、数据集查询、函数查询、条件查询、排序查询、分组等。工具的ORM结构化实体查询(EQL)提供可以像写SQL语句一样直接查询。ECG提供ENTITYColumn类(或ENTITY.s_静态属性)帮助System.Database.DbCore.Select从数据源查询数据,Select通过ENTITYColumn实体属性(或ENTITY.s_静态属性,下同),构造查询并返回结果数据集。(EQL即EntityQuery
Language)
1、常用实体对象查询
常用实体对象查询,见上节所述,这里就不在赘述。
2、ORM结构化查询
这里先介绍表实体原描述信息类ENTITYColumn,这里“ENTITY”为表实体类对应的占位符,其类下有实体所对应的表的表名和表字段的公共静态只读信息。其中的TableName为每个该类的对应表名,各属性字段为表名、字段名、字段对应类型的完全限定名,以键盘不能直接输入的偏僻符号’┋’为分割符拼接而成。ORM结构化查询时可使用该类的属性(或ENTITY.s_静态属性,下同)。
(1)、Select查询
System.Database.DbCore类提供Select方法及其相应的重载,以SqlServer自带的pubs库为例,可见如下代码:
DataSet dst =new
DataSet(); DbCore dbCore = new DbCore(DatabaseType.SqlServer,"Server=(local);User id=sa;Pwd=sa;Database=pubs");
|
DataSet dst =
dbCore.SelectAll().From("sales").ExecuteDataSet();
|
DataSet dst =
dbCore.SelectAll().From(SALESColumn.TableName).ExecuteDataSet();
|
DataSet dst = dbCore.Select(SALESColumn.ord_num).From(SALESColumn.TableName).ExecuteDataSet();
|
DataSet dst = dbCore.Select(SALESColumn.ord_num).SelectColumn(SALESColumn.ord_date).From(SALESColumn.TableName).ExecuteDataSet();
|
DataSet dst =
dbCore.SelectAll().From(newSALES()).ExecuteDataSet();
|
其中的dbCore.SelectAll()方法缺省默认参数为查询所有字段,Select()不选择出任何字段,仅初始化实例,同时也可直接使用SQL语法的字符串或使用相应的ENTITYColumn类如SALESColumn的属性字段作为参数,或数组集合信息。也可用SelectColumn添加要查询的字段,SelectColumn(…)接受SQL表字段名字符串或ENTITYColumn类的属性字段格式的参数,SelectColumns(…)接受符合SelectColumn格式的数组参数,同时也提供SelectCustom(…)接受自定义的SQL语法的字符参数。同时鉴于SelectColumn等方法名较长,提供Add替代SelectColumn,AddMax、Min、Avg分别替代SelectColumnMax、Min、AvgValue各种同构方法,便于代码的抒写。
From(…)为查询的目标表名,这里使用的是SALESColumn.TableName,也可直接使用表名字符串,同时接受实体对象作为参数。ExecuteDataSet()执行查询并返回在内存当中的DataSet格式的结果数据集。ExecuteReader()执行查询并返回只读向前的数据结果集流IDataReader;ExecuteScalar()快速执行查询并返回第一行第一列的Object值,下同。
(2)、From连接
先见如下代码:
DataSet dst =new
DataSet();DataSet dst1=
new DataSet(); DbCore dbCore = new DbCore(DatabaseType.SqlServer,"Server=(local);User id=sa;Pwd=sa;Database=pubs");
|
dst = dbCore.SelectAll().From().JoinInner("sales","stor_id ",
"stores","stor_id") .ExecuteDataSet();
|
dst = dbCore.SelectAll().From().JoinInner(SALESColumn.stor_id,STORESColumn.stor_id) .ExecuteDataSet();
|
dst = dbCore.SelectAll().From().JoinLeft("sales","stor_id ",
"stores","stor_id") .ExecuteDataSet();
|
dst = dbCore.SelectAll().From().JoinLeft(SALESColumn.stor_id,STORESColumn.stor_id) .ExecuteDataSet();
|
dst = dbCore.SelectAll().From().JoinRight("sales","stor_id ",
"stores","stor_id") .ExecuteDataSet();
|
dst = dbCore.SelectAll().From().JoinRight(SALESColumn.stor_id,STORESColumn.stor_id) .ExecuteDataSet()
|
dst = dbCore.SelectAll().From().JoinFull("sales","stor_id ",
"stores","stor_id") .ExecuteDataSet();
|
dst = dbCore.SelectAll().From().JoinFull(SALESColumn.stor_id,STORESColumn.stor_id) .ExecuteDataSet();
|
这里是以SqlServer系统自带pubs示例库的表sales、stores为例介绍的,JoinInner为内连接、JoinLeft为左外连接、JoinRight为右外连接、JoinFull完全外连接。参数可直接使用表名及表字段名字符串,或使用SALESColumn、 STORESColumn类,其中使用实体类静态属性字段代码可读性及维护性更好些。下面看下Where的使用。
(3)、Where语句的Condition条件
DataSet dst =new
DataSet(); DataSet dst1 =
new DataSet(); DbCore dbCore = new DbCore(DatabaseType.SqlServer,"Server=(local);User id=sa;Pwd=sa;Database=pubs");
|
dst = dbCore.SelectAll().From().JoinInner("sales","stor_id ",
"stores","stor_id") .Where().ConditionAndEqual("sales","stor_id", 7067).ExecuteDataSet();
|
dst1 = dbCore.SelectAll().From().JoinInner(SALESColumn.stor_id,STORESColumn.stor_id) .Where().ConditionAndEqual(SALESColumn.stor_id, 7067).ExecuteDataSet();
|
|
dst = dbCore.SelectAll().From().JoinInner("sales","stor_id ",
"stores","stor_id") .Where().ConditionAndGreat("sales","stor_id", 7896) . ConditionOrLessEqual("sales","stor_id", 7067).ExecuteDataSet();
|
dst1 = dbCore.SelectAll().From().JoinInner(SALESColumn.stor_id,STORESColumn.stor_id) .Where().ConditionAndGreat(SALESColumn.stor_id, 7896) .ConditionOrLessEqual(SALESColumn.stor_id, 7067).ExecuteDataSet();
|
|
dst = dbCore.SelectAll().From("sales").FromTable("stores")
.Where().ConditionColumnAndEqual("sales","stor_id",
"stores","stor_id"). ConditionAndBetweenAnd("sales",
"stor_id", 7067, 7896).ExecuteDataSet();
|
dst1 = dbCore.SelectAll().From(SALESColumn.TableName).FromTable(STORESColumn.TableName) .Where().ConditionColumnAndEqual(SALESColumn.stor_id,STORESColumn.stor_id). ConditionAndBetweenAnd(SALESColumn.stor_id, 7067, 7896).ExecuteDataSet();
|
这里再次展示了使用字符串和ENTITYColumn类的相互比较,可见使用ENTITYColumn更直观,可读及维护性更好些。Where()是不带参数的实例化方法,所添加的查询条件均以Condition…开头,在这里可以添加关系运算包括Equal(=), Less(), LessEqual(=), NotEqual(、!=), BetweenAnd, in, not in, null, not null,like,not like和各自的关系and,or比较
及表字段与字段之间的=,, =,关系and,or的连接等;另外还可以添加自定义的Where条件语句等。
(4)、Order By排序功能
这里切换到Oracle数据库,以Oracle自带的scott用户为例,先看如下代码:
DataSet dst =new
DataSet(); EMP entity =
new EMP(); DbCore dbCore =new
DbCore(DatabaseType.Oracle,"Password=tiger;User ID=scott;Data Source=oracle9");
|
dst = dbCore.SelectAll().From(entity) .Where().ConditionAndGreat(entity,EMPColumn.DEPTNO, 20) .OrderBy(EMPColumn.SAL).ExecuteDataSet();
|
dst = dbCore.SelectAll().From(entity) .Where().ConditionAndGreat(entity,EMPColumn.DEPTNO, 20) .OrderBy().Asc(EMPColumn.SAL).ExecuteDataSet();
|
dst = dbCore.SelectAll().From(entity)
.Where().ConditionAndGreat(entity, EMPColumn.DEPTNO, 20)
.OrderBy().Desc(EMPColumn.SAL).ExecuteDataSet();
|
dst = dbCore.SelectAll().From(EMPColumn.TableName) .Where().ConditionAndGreat(EMPColumn.DEPTNO, 20).ExecuteDataSet();
|
其中entity为雇员表EMP对应的实体对象,这里使用查询表名的地方也可直接用实体对象。OrderBy默认不带排序参数,只实例化对象,也可带排序字段,排序方式为升序;其后使用Asc添加升序字段,Desc添加降序字段。
(5)、GroupBy分组条件及排序
这里同样以Oracle自带的scott用户为例,先看如下代码:
DataSet dst =new
DataSet(); DataSet dst1 =
new DataSet(); EMP entity =
new EMP(); DbCore dbCore =new
DbCore(DatabaseType.Oracle,"Password=tiger;User ID=scott;Data Source=orac");
|
dst = dbCore.Select().SelectColumnMaxValue(EMPColumn.EMPNO) .SelectColumnMinValue(EMPColumn.EMPNO).SelectColumnAvgValue(EMPColumn.EMPNO) .From(EMPColumn.TableName) .GroupBy(EMPColumn.DEPTNO).Column(EMPColumn.SAL) .Having().ConditionAndGreatEqual(EMPColumn.DEPTNO,10) .ConditionAndLessEqual(EMPColumn.DEPTNO, 40).ExecuteDataSet();
|
dst1 = dbCore.Select().AddMax(EMPColumn.EMPNO) .AddMin(EMPColumn.EMPNO).AddAvg(EMPColumn.EMPNO) .From(EMPColumn.TableName) .GroupBy(EMPColumn.DEPTNO).Column(EMPColumn.SAL) .Having().ConditionAndGreatEqual(EMPColumn.DEPTNO, 10) .ConditionAndLessEqual(EMPColumn.DEPTNO, 40).ExecuteDataSet();
|
|
dst = dbCore.Select().SelectColumn(EMPColumn.DEPTNO).SelectColumn(EMPColumn.SAL) .SelectColumnMaxValue(EMPColumn.EMPNO).SelectColumnMinValue(EMPColumn.EMPNO) .SelectColumnAvgValue(EMPColumn.EMPNO) .From(EMPColumn.TableName)
.GroupBy(EMPColumn.DEPTNO).Column(EMPColumn.SAL) .Having().ConditionAndGreatEqual(EMPColumn.DEPTNO, 10) .ConditionAndLessEqual(EMPColumn.DEPTNO, 40) .OrderBy(EMPColumn.DEPTNO).Asc(EMPColumn.SAL).Asc("3").ExecuteDataSet();
|
dst1 = dbCore.Select().Add(EMPColumn.DEPTNO).Add(EMPColumn.SAL)
.AddMax(EMPColumn.EMPNO).AddMin(EMPColumn.EMPNO).AddAvg(EMPColumn.EMPNO) .From(EMPColumn.TableName) .GroupBy(EMPColumn.DEPTNO).Column(EMPColumn.SAL) .Having().ConditionAndGreatEqual(EMPColumn.DEPTNO, 10) .ConditionAndLessEqual(EMPColumn.DEPTNO, 40) .OrderBy(EMPColumn.DEPTNO).Asc(EMPColumn.SAL).Asc("3").ExecuteDataSet();
|
|
dst = dbCore.Select().SelectColumn(EMPColumn.DEPTNO).SelectColumn(EMPColumn.SAL) .SelectColumnMaxValue(EMPColumn.EMPNO).SelectColumnMinValue(EMPColumn.EMPNO) .SelectColumnAvgValue(EMPColumn.EMPNO) .From(EMPColumn.TableName) .Where().ConditionAndBetweenAnd(EMPColumn.MGR, 7698, 7788) .ConditionAndGreatEqual(EMPColumn.HIREDATE,new
DateTime(1981, 5, 1)) .ConditionAndLessEqual(EMPColumn.HIREDATE,DateTime.Today) .GroupBy(EMPColumn.DEPTNO).Column(EMPColumn.SAL) .Having().ConditionAndGreatEqual(EMPColumn.DEPTNO, 10) .OrderBy(EMPColumn.DEPTNO).Asc(EMPColumn.SAL).Asc("3").ExecuteDataSet();
|
dst1 = dbCore.Select().Add(EMPColumn.DEPTNO).Add(EMPColumn.SAL) .AddMax(EMPColumn.EMPNO).AddMin(EMPColumn.EMPNO).AddAvg(EMPColumn.EMPNO) .From(EMPColumn.TableName) .Where().ConditionAndBetweenAnd(EMPColumn.MGR, 7698, 7788) .ConditionAndGreatEqual(EMPColumn.HIREDATE,new
DateTime(1981, 5, 1)) .ConditionAndLessEqual(EMPColumn.HIREDATE,DateTime.Today) .GroupBy(EMPColumn&l
|