简介
在这篇文章中,我想要演示如何使用 Borland? Delphi TM 8 for the Microsoft?
.NET Framework(缩写为“Delphi 8 for .NET”)的 Architect 版本,特别是
Borland Enterprise Core Object(ECO TM)部分中的功能,来设计一个持久存储在
IBM? DB2? Universal Database TM(UDB)SAMPLE 数据库中的对象模型(Object
Model)。
从 ECO 着手
Enterprise Core Object 功能只能在 Delphi 8 for .NET 的 Architect
版本中获得。
执行 File | New - Other,并从 Object Repository
的 Delphi for .NET Projects页中选择 ECO Windows Forms Application图标(见图
1)。
图 1. Delphi 8 for .NET Object Repository
这将显示一个对话框,您可以在其中指定新的 ECO 项目的名称和位置(见图 2)。
图 2. 新建 ECO 应用程序
正如可在 Project Manager 中看到的,DB2ECO 项目包含三个单元:CoreClassesUnit.pas、DB2ECOEcoSpace.pas
和 WinForm.pas。Project Manager 面板上有三个选项卡:一个用于 Project Manager(默认视图),一个用于
Model View,还有一个用于 Data Explorer。Model View 对于 ECO 项目特别有用(见图
3)。
图 3. Model View
CoreClasses 包节点(带有灰色文件夹图标)包含一个 CoreClasses
图节点。双击 CoreClasses 图节点来启动 Delphi 8 for .NET IDE 中的 UML Designer。您可以使用
UML 技术在这里设计您的对象。例如,通过右击 UML Designer,您可以创建新的类,并且可在类中添加属性、操作或构造函数。此外,您还可以使用
Tools Palette上专门的 UML Class Diagram类别中的画图组件(见图 4)。
图 4. UML Class Diagram
构建对象模型
通过这些构建块,您可以构建一个对象模型。例如,右击 UML Designer并创建一个新类。称其为 Person。右击
Person 并添加四个 string 类型的属性: FIRSTNME、 MIDINIT、 LASTNAME 和
SEX。请注意与数据库表不同的是,无法指定字符串(string)属性的长度 —— 只有指定它们为字符串类型的选项。现在,再次右击该类并添加第五个属性,该属性称作
BIRTHDATE 并且为 DateTime 类型。请注意, Object Inspector会将该类型自动更改为
System.DateTime。
除了通用的 Person 类,我还想要再添加一个特定的 Employee 类
—— 例如一个模仿 DB2 UDB SAMPLE 数据库中 EMPLOYEE 表的布局的类(这或许可以解释我在
Person 类中所使用的属性名)。因此,右击 UML Designer并创建一个新类,这次称作 Employee。因为
Employee 是一个特殊化的 Person,所以您应该单击工具面板(tool palette)上 UML Class
Diagram类别中的 Generalization/Implementation 画图组件,然后从新的 Employee
类画一条直线到 Person 类。这将在 UML 图以及 Delphi 源代码中描绘以下事实:Employee
是从 Person 派生的。
Employee 当然也具有一些特定的属性,因此请右击 Employee 类并添加四个新的字符串类型的属性,分别称作
EMPNO、 WORKDEPT、 PHONENO 和 JOB。还要添加一个 System.DateTime 类型的属性
HIREDATE,一个 Smallint 类型的属性 EDLEVEL,以及三个 Decimal 类型的属性,分别称作
SALARY、 BONUS 和 COMM。这将产生图 5 所示的小型 UML 图。
图 5. UML 模型
我将之作为练习留给读者来扩展 UML 模型。较好的实践同样是仿效 IBM DB2
UDB SAMPLE 数据库中的其他表(如 DEPARTMENT 表,或 EMP_ACT、EMP_PHOTO 和
EMP_RESUME 表 —— 将后者集成到 Employee 类中)。
在 DB2 中持久存储模型
除了提供 UML Designer,Delphi 8 for .NET 中的 Enterprise Core Object
还提供持久存储该对象模型的能力。这可以在一个简单的 XML 文件或真正的 DBMS(例如 IBM 的 DB2 UDB)中完成。
对于持久性的功能,您需要转移到 Object Manager中的 DB2ECOEcoSpace.pas
单元。该单元定义您的 EcoSpace,并且可通过工具面板(Tool Palette)上 Enterprise
Core Objects 类别中的组件来定制。您可能需要特别查看其中三个 PersistenceMapper 组件:PersistenceMapperXml、PersistenceMapperSqlServer
和 PersistenceMapperBdp。PersistenceMapperXml 组件可以在 XML 文件中保存
EcoSpace,而其他两个在 DBMS 中保存 EcoSpace。对于 DB2,您必须使用 PersistenceMapperBdp组件,因此请在您的
EcoSpace 模块上放置一个。
您必须执行三个步骤来使应用程序使用该组件。首先,您需要配置 SqlDatabaseConfig
属性,该属性默认地包含一个 <<EMPTY PERSISTENCE MAPPER CONFIG>>
值。您可以通过使用 Object Inspector底部的一个动词来指定正确的值。因为您需要将 DB2 用作持久性数据库,所以您必须单击
DB2 setup链接。单击该动词不见得会完成许多工作(不会启动对话框),但是如果您再看一下,您将注意到 SqlDatabaseConfig
属性现在已被赋予了一个专用于 DB2 设置(setup)的值。
下一步将涉及 BdpConnection 组件,该组件映射到您需要用以存储对象模型的特定的
DB2 UDB 数据库。从 Data Explorer中,仅将针对 DB2 UDB SAMPLE数据库的 Db2Connection
拖至 EcoSpace 模块。这将产生一个 BdpConnection 组件,该组件被配置为使用 IBM DB2
UDB SAMPLE 数据库。现在选择 PersistenceMapperBdp 组件,并将其 Connection
属性指向 BdpConnection 组件。
现在,您只需要告诉您的 EcoSpace 模块要将 PersistenceMapperBdp
组件用作它的 PersistenceMapper(即作为持久存储模型的方法),因此要单击 EcoSpace 模块,并在
Object Inspector中选择 PersistenceMapperBdp 作为 PersistenceMapper
属性的值。请注意,您可以在运行时动态地指定该属性,这允许您切换持久性策略(例如,当未连接网络和 DB2 UDB
数据库时,使用单独的 XML 持久性文件作为本地公文包模型,然后当返回办公室时,重新连接 DB2 数据库为持久性方法)。
生成 DB2 模式
您完成了持久存储模型的大多数工作。剩下的就是 UML 模型和数据库模式之间的真正链接。虽然 IBM DB2
UDB SAMPLE 数据库已经包含了一个名为 EMPLOYEE 的表,但是该表不能直接与您 UML 模型中的
EMPLOYEE 类相兼容。为了自动创建正确的数据库模式(本例中,针对 DB2 SAMPLE 数据库),您应该单击
EcoSpace 模块上左下方的按钮来生成数据库模式,这将告诉您哪些表需要重新创建(如果 UML 模型中修改了它们相应的类定义),以及哪些表可以被删除
—— 如果您希望如此 —— 由于 UML 模型未使用它们,因此系统将之看作是“不必要的”。
对于本例,默认的 IBM DB2 UDB SAMPLE 数据库中,要(可选地)删除的表列表可在图
6 中看到,该图还显示了 PersistenceMapperBdp、BdpConnection 组件,以及 Tools
Palette 中的 Enterprise Core Objects 组件。
图 6. 生成模式
比起您可以删除的表(应该为无),更令人感兴趣的是必须被删除和重新创建的表。对于这些表,没有任何选择。在本例中,这意味着要重新创建
EMPLOYEE 表(见图 7)。前一 EMPLOYEE 表及其所有数据都将被删除,并且将创建一个新的 EMPLOYEE
表和一个新的 PERSON 表(但是因为已经不存在 PERSON 表了,所以无需删除它)。
图 7. 必须被删除/重新创建的表
如果您曾修改过 UML 模型,您就可以重新创建数据库模式,以便确保数据库表和
UML 模型以后保持同步。
生成数据库模式之后,DB2 UDB SAMPLE 数据库将获得新版本的 EMPLOYEE
表,以及 PERSON 表和六个新的特定于 ECO 的表,分别称作 ECO_ID、ECO_MEMBERMAPPING、ECO_R_CLSMAP、ECO_TABLES、ECO_TYPE
和 ECO_W_CLSMAP。
使用对象模型
我已经展示了如何使用 UML Designer 定义对象模型,以及如何使用 PersistenceMapperBdp
组件持久存储 EcoSpace。但是,我还未向您展示如何真正地使用 EcoSpace 中的对象。为此,让我们转移到
WinForm.pas 单元,该单元已经在设计器(designer)的非可视组件区域中包含了五个 ECO 组件。
您需要添加来自于 Enterprise Core Objects 类别的附加组件,即
ExpressionHandler。将 ExpressionHandler 的 RootHandle 属性指向
rhRoot 组件。通过 ExpressionHandle,您可以构建可被显示的 OCL 表达式;例如,DataGrid
中所有 Employee 或 Person 的集合。要构建 OCL 表达式,请选择 ExpressionHandle
组件,并双击 Expression 属性,这将显示 OCL Expression Editor(见图 8)。
图 8. OCL Expression Editor
例如,我已经构建了 EMPLOYEE.allInstances 表达式,但是您还可以构建
PERSON.allInstances 表达式或任何其他需要显示的 OCL 表达式。
要真正显示该 OCL 表达式的结果,您可以使用 Tool Palette上
Data Controls类别中的 DataGrid 控件,并将其 DataSource 属性指向 ExpressionHandler
组件。这将产生如图 9 所示的结果。
图 9. 带有 DataGrid 的 WinForm
您或许还需要做一件事:虽然当前的应用程序在 DataGrid 中显示了所有的
Employee,并且带有编辑和持久性存储它们的选项,但是您仍然需要一种方式来创建新的 Person 或 Employee(以便在
DataGrid 中显示它们,然后您可以在 DataGrid 对它们进行编辑)。
为此,要在 Windows Form上放置一个按钮,并将其 Text属性设置为“New”,以及在
Click 事件处理程序中编写一行代码:
最初,这感觉有点奇怪,因为您创建了一些东西,却没有使用它。但是如果您仔细观察,就将注意到您是在 EcoSpace
的上下文中创建新的 Employee —— 这意味着它将生存于 EcoSpace 中,并且将在 DataGrid
中进行显示(因为它连接了 OCL 表达式 EMPLOYEE.allInstances)。
最后一步包含用以保存模型(以及持久存储在 IBM DB2 UDB SAMPLE
数据库中)的显式动作。放置第二个按钮,将其 Text 属性设置为 Save 并且在 Click 事件处理程序中同样编写下面一行代码:
这将为您持久存储模型并且更新 IBM DB2 UDB SAMPLE 数据库。
结束语
本文中,我展示了 IBM DB2 UDB 是一个功能强大的 DBMS,可用作 Delphi 8 for .NET
的 Enterprise Core Object 的持久层,以构建持久性的对象模型。ECO 和 DB2 UDB
的集成是无缝的,并且产生了功能强大、模型驱动的应用程序。
|