1、XPO 开发指南摘要 引用 2007-10-16 14:59:46| 分类: 数据库相关 | 标签: |字号大中小 订阅 一XPO 简介: XPO 即 eXpress Persistent Objects for .NET,现在这里介绍的版本是 1.5。XPO 在应用程序代码和数据库之间扮演了一个中间层的角色,简单而言,就是将面向对象编程所建立的对象在数据库中做一个映射,使之和数据库中的表建立一一对应的关系。XPO 现在的版本已经可以处理对象之间一对多,多对多等关系的处理,继承在数据库中的实现以及根据情况处理进行数据库的并发访问,提高系统的效率。XPO 最大的好处就是可以将应用程序开发者从繁琐
2、的数据库设计中解脱出来,专心建立业务对象系统,如何将这些对象映射到数据库中,这一切都可以交给 XPO 来自动处理了。二XPO 的简单使用:XPO 的使用十分简单,如果是应用系统的数据关系不复杂,对于应用开发人员而言,根本上可以不了解 XPO 太深入的技术,只需要在建立对象类过程中,遵循一定的规则就可以了。而且在使用过程中也根本可以不去关心数据库后台发生的事情,例如后台是什么数据库,表到底有多少等。1建立对象类:首先是需要定义对象,一切的对象只需要继承于 XPObject 即可。例如下面的代码就是建立一个 Member 的类,其中涉及到名字和年龄。这个是一个最简单的例子,在使用过程中根本不需要考
3、虑数据库到底建立了没有,以及数据库建立在那里等。当然,如果在应用中需要了解这些信息,在后面的介绍中可以看到,其实 XPO 同样提供了十分丰富的函数来获取这些信息的。using System;using DevExpress.Xpo;namespace testXPO/ / Member 的摘要说明。/ public class Member : XPObjectpublic string strName;public int iAge; public Member()/ TODO: 在此处添加构造函数逻辑/2使用和保存这些对象的数据:以下代码是定义一个 Member,并且将这些数据保存起来的例
4、子:Member m = new Member();m.iAge = 15;m.strName = “testName“;m.Save();可以看到使用起来十分方便,一点也看不到数据库操作的影子。3获取对象的集合信息:保存的信息如何全部获取呢?以下是个例子:foreach (Member m in new XPCollection(typeof(Member)lstResult.Items.Insert(0,“Age:“ + m.iAge + “; Name:“ + m.strName);假设将全部 Member 的信息显示在一个 ListBox 中。小结:到此为止对于如何使用 XPO 应该有
5、个很初步的了解了。步骤大致如下:1 将 DevExpress.XPO.dll 引用进来;2 声明使用 using DevExpress.XPO;;3 需要数据保存的类则继承于 XPObject;4 需要对外的信息则定义成字段即可,一切象一般创造一个类无异;XPO 到底做了些什么呢?面对这么简单的代码,其实和数据库的互动已经全部由 XPO 自动帮你完成了。1 运行后会在当前目录下建立一个.MDB 的数据文件;2 打开这个数据文件可以发现有两个系统自动建立的表: XPDeletedObject 和 XPObjectType;3 另外还有就是对应类的表了,这里是 Member 表。在 MDB 中的结
6、构如下图所示:到此为止我们已经可以用 XPO 来完成新建表,新建记录,返回全部记录这些传统的数据库操作了。虽然功能十分简单,但是可以大致了解 XPO 大致会为我们做些什么了,会给我们带来一些什么的方便了。三XPO 的进一步使用:(一)对象关系的处理:XPO 支持对象之间一对一,一对多和多对多的关系。1定义一对多的关系:假设有一个 Student 的类和一个 Class 类是一对多的对应关系,一个学生可以有多个 Class 的信息。类图关系如下:Class 类对应的代码:using System;using DevExpress.Xpo; namespace testXPO/ / Class 的
7、摘要说明。/ public class Class : XPObjectAssociation(“StudentClasses“)public Student Student;public string Name;public int Credit;public Class()/ TODO: 在此处添加构造函数逻辑/Student 类对应的代码using System;using DevExpress.Xpo;namespace testXPO/ / Student 的摘要说明。/ public class Student : XPObjectpublic string Name;public
8、 int Age;Association(“StudentClasses“, typeof(Class)public XPCollection Classes get return GetCollection(“Classes“); public Student()/ TODO: 在此处添加构造函数逻辑/其中 Association 属性部分就是关键定义这个一对多关系的代码。以下代码是添加记录的代码,假设添加 5 个学生,每个学生有不同的三门课程。for (int i=1;i/ Staff 的摘要说明。/ public class Staff : XPObjectpublic string N
9、ame;public int Age;Association(“DeanStaffs“)public Dean Dean = null;public Staff()/ TODO: 在此处添加构造函数逻辑/定义 Dean 的代码:using System;using DevExpress.Xpo;namespace testXPO/ / Dean 的摘要说明。/ public class Dean : Staffpublic string Department;Association(“DeanStaffs“, typeof(Staff)public XPCollection Staffs ge
10、t return GetCollection(“Staffs“); public Dean()/ TODO: 在此处添加构造函数逻辑/可见继承关系除了面向对象本身定义了的继承外,还需要声明之间的关系,这个关系就是对应到数据库中的关系了。以下是生成数据的代码:for (int i=1;i/public static bool TimeOut;/private System.Timers.Timer myTimer;void Application_Start(object sender, EventArgs e) / 在应用程序启动时运行的代码if (!DevExpress.Xpo.Sessio
11、n.DefaultSession.IsConnected)Business.DBManage.SHWengGuangSession.ConnectionString = System.Configuration.ConfigurationManager.AppSettings“ConnectionString“.ToString();/ DBManage.BSRSJSession.ConnectionString = System.Configuration.ConfigurationSettings.AppSettings“BSRSJConnectionString“;/每次系统重新启动时清
12、理数据库中已经删除的数据/DBManage.BSRSJSession.PurgeDeletedObjects();Business.DBManage.SHWengGuangSession.PurgeDeletedObjects();void Application_End(object sender, EventArgs e) / 在应用程序关闭时运行的代码void Application_Error(object sender, EventArgs e) / 在出现未处理的错误时运行的代码/zsl 使用 application_error 错误机制显示出错信息/Response.Redire
13、ct(“/shwengguang/ErrorMessage.aspx“);Server.Transfer(“/shwengguang/ErrorMessage.aspx“, false);void Session_Start(object sender, EventArgs e) / 在新会话启动时运行的代码void Session_End(object sender, EventArgs e) / 在会话结束时运行的代码。 / 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为/ InProc 时,才会引发 Session_End 事件。如果会话模式设置为
14、StateServer / 或 SQLServer,则不会引发该事件。(四)XPO 中查询数据:对于查询,就是指定一定的条件获取一个数据集合。在 XPO 中,返回结果的集合用 XPCollection 作统一处理,而条件查询的条件设置,则通过BinaryOperator 来指定。例如:要查询出生日期在”01/02/1960” 年之前的客户资料:new XPCollection(typeof(Customer), new BinaryOperator(“BirthDate“, new DateTime(1960, 1, 2), BinaryOperatorType.Less)如果条件是组合的,例
15、如:要查询出生日期在”01/02/1960”年之前的且地址是第十大街的顾客的资料:GroupOperator criteria = new GroupOperator();criteria.Operands.Add(new BinaryOperator(“BirthDate“, new DateTime(1960, 1, 2), BinaryOperatorType.Less);criteria.Operands.Add(new BinaryOperator(“Address.Street“, “10th Avenue“);new XPCollection(typeof(Customer),
16、criteria)(五)XPO 中的事务处理:XPO 提供了类似于 Microsoft ADO.NET 中的事务处理,你可以在 Session 中使用 Begin,Commit 或者 Rollback 的方法来完成处理。在当前的版本中,事务处理的嵌套并不支持。以下代码是事务处理的例子:class Account: XPObject public double Amount = 0;protected override void BeforeSave() base.BeforeSave();if (Amount / Circle 的摘要说明。/ public struct Point Persistent(“Abscissa“)public int X;public int Y;public class Circle : XPObjectpublic string Name = “;Persistent(“Location“)public Point Center;public Circle()/ TODO: 在此处添加构造函数逻辑/