缺失的环节
创建高效、可维护、分区的应用程序
应用程序分区是近期的热门话题。如果您一直关注我在本出版物和 ISUG Journal 中的文章,您一定已经开始了解应用程序分区的全部内容。您现在知道,应用程序有三个逻辑层:用户界面、业务访问和数据访问。您还知道,.NET 应用程序分区的最终目标是将业务和数据访问逻辑提取到不同的程序集中,然后 GUI 层可以调用这些程序集中的方法来完成应用程序处理。
关于独立的数据访问程序集,有一个关键问题一直困扰着我。如果每个程序集都需要自己的连接,那该有多么低效。多个程序集,每个程序集都在自己的内存空间中运行,如何共享数据库连接?分布在多个程序集中的方法如何能够参与单个数据库事务?这些问题的答案将是发现它们可以实现健壮分区应用程序的“缺失的环节”。
与难以捉摸的大脚怪不同,.NET 和 PowerBuilder 提供了一个“开箱即用”的共享连接解决方案。在本文中,我将解释其中的一些理论,并向您展示在分区、程序集化的 PowerScript 应用程序中使用共享连接的基本机制。
背景
设计 .NET Framework 的 Microsoft 工程师们考虑到了共享连接问题,并提供了解决方案。他们的解决方案是 ADO.NET 接口 IDbConnection。用 Microsoft 在线库的话来说,“IDbConnection 代表与数据源的打开连接,并由访问关系数据库的 .NET Framework 数据提供程序实现。” 更具体地说,“IDbConnection 接口使继承类能够实现 Connection 类,该类代表与数据源的唯一会话(例如,与服务器的网络连接)。” IDbConnection 是 System.Data
命名空间的一个成员。图 1 显示了从对象浏览器中看到的 IDbConnection 的成员。
对于 PowerScript 世界的开发人员来说,更重要的是 Sybase 工程师实现了名为 ADOConnectionProxy 的类。它是 Sybase.PowerBuilder.DataSource.Sharing
命名空间的一个成员。要查看该类的成员,您必须将 Sybase.PowerBuilder.DataSource.Sharing
程序集添加为应用程序的引用,并在解决方案资源管理器中导航到它。图 2 显示了您将看到的内容。注意:如果您使用 PowerScript 进行编码,则无需添加此引用。
在 PowerScript 开发人员使用 Transaction 对象作为数据库的通道的隐式理解下,Sybase 工程师扩展了 Transaction 类管理共享连接的能力。好消息是,现有的 PowerScript 以数据库为中心的代码将不需要修改即可与共享连接一起工作。好用的 SQLCA 依然健在!更棒的消息是,您的 PowerScript 代码甚至不需要知道 IDbConnection 或 ADOConnectionProxy 的存在。
使用这个类,可以将连接(包括事务状态)在 PowerBuilder 和 C# 程序集之间传递。C# 代码将添加对 Sybase 程序集的引用,并与该类的成员进行交互。在本文的其余部分,我将专注于纯 PowerBuilder 解决方案的基础知识。
文档说明: 在撰写本文时,ADOConnectionProxy 的文档只能在 PowerBuilder .NET 功能指南的“PowerBuilder.NET 中的数据库管理”部分找到。新的方法和功能尚未集成到在线帮助或对象和控件书籍的 Transaction 对象部分。
通过示例进行处理
这个简化的示例有两个目标:一个 WPF GUI 和一个程序集。图 3 显示了我的解决方案。GUI 将打开一个数据库连接,然后将其传递给程序集中的一个方法。程序集将使用接收到的连接来发出 SQL SELECT 语句,并将结果发送回调用者。
如果连接或 SQL 语句失败,它将引发异常。当您查看代码时,它几乎是显而易见的简单。
首先,您必须使用 PowerBuilder ADO.NET 驱动程序连接到数据库。如果您还没有,您将需要安装 DBMS 的 ADO.NET 提供程序程序集。(如果您不知道提供程序是什么:ADO.NET 数据提供程序模型在 .NET Framework 中提供了一个通用的托管接口,用于连接和与数据存储交互。几乎所有现代 DBMS 都有一个提供程序。)在我们这个小概念验证示例中,我们将使用 System.Data.ODBC
提供程序。图 4 显示了我的 DBProfile 设置,它使用 ODBC 连接到托管 EAS Demo DB V120 数据库的 ASA Engine。列表 1 显示了运行时连接代码。
注意:我想通过查看 Trace 数据库输出来展示我的结果。然而,在撰写本文时,使用 TRACE ADO.NET 驱动程序的数据库跟踪并未打开跟踪文件。我不知道这是一个功能还是一个缺陷。我已经将此问题报告给了工程部门。
如前所述,Sybase 工程师扩展了 Transaction 类管理共享连接的能力。他们添加了两个方法来支持共享连接。第一个方法 GetAdoConnection( )
从由 Transaction 对象维护的连接中返回一个活动的 ADOConnectionProxy 对象。第二个方法 SetAdoConnection()
将一个 ADOConnectionProxy 应用到 Transaction 对象。
列表 2 显示了 WPF 应用程序中调用者的代码。它实例化程序集,获取数据库连接,并在方法调用时将其传递给程序集。
列表 3 显示了程序集方法。请注意,为了避免添加 Sybase.PowerBuilder.DataSource.Sharing
程序集的引用,参数是通过 System.Object
父类型引用传递的。另请注意,如果任何以数据库为中心的出现问题,该方法将通过引发异常来通知调用者。
很简单,不是吗?我相信通过这项技术,可以创建高效、可维护、分区的应用程序。
PowerBuilder 万岁!