无处不在的Web Services数据
在当前版本的ADOCE(V3.1)中,我们必须找到另一种处理Web Service(SOAP)调用返回数据的方法。在本文中,我将同大家对一些示例代码进行探讨,看看如何使用从一个SOAP响应中返回的数据。该示例假定Recordset(记录集)按照Chris Dengler文中所介绍的Solution 2封装方式进行封装。因为Chris在他的文章中已经对这种解决方案的实现方式进行了详细描述,在本文中我就不再对所需的服务器端代码多加叙述了。
一个测试客户端程序
在我们开始讨论代码之前,让我们首先了解一下使用Web Services传输数据对我们有哪些好处。在下面这个窗体中,我创建了一个简单的测试用客户端程序,该程序将两个不同的Web Services结合到了一个Microsoft eMbedded Visual Basic 应用程序之中。
SOAP客户端测试程序示例
窗体顶部的TextBox(文本框)用来选择所需的Web Service(描述)。这个URI (Universal Resource Identifier)是使用SOAP Toolkit Wizard创建的SDL(服务描述语言,Services Description Language)文件。
我已经创建了第一个Web Service,您可以调用这个Web Service (使用顶部的“Get”按钮),这个Web Service 主要用于测试目的。它调用一个简单的Web Service,将您提交的名和姓作为参数连接到了一个包含完整名称的字符串中。
当您输入一个已经在服务器上进行了定义的DSN(数据源名称)以及一个针对该DSN的SQL(结构化查询语言)查询,然后点击“Get”按钮时,它开始变得更有意思了。DSN和SQL作为一个参数传递给了Web Service,然后以XML格式返回一个ADO Recordset。数据经过分析后,填充在窗体底部的ListView控件中。
在正确对服务器进行了设置的前提下,现在,您可以方便地访问您的企业数据了。您无需任何第三方产品--甚至不使用ADOCE--即可轻松做到这一点。对此,我的一位同事说,“这实在令人惊讶!”
代码讨论
以下代码为cmdGetRecordset_Click事件的代码(当您按下窗体底部的“Get”按钮时运行):
|
Dim lavParameters(2) As Variant ' Make SOAP Call ' Clear and add ListView headings |
代码说明:
传递给SOAP方法的两个参数(DNS和SQL)是从TextBox控件中取得的,其返回值是XML格式的ADO数据集。如需了解同SOAPCall函数及其参数有关的更详细信息,请参阅我的循序渐进文章“为Microsoft .NET做好准备”。
正如您看到的,整个实现方式类似于ADO Recordset的使用方式(简化了代码复用)。以“XMLRS…”开始的这些函数保存在XMLRS.bas模块,让我们深入到模块内部看一下。以下是XMLRSOpen 函数中的一部分代码:
|
' Create DOM object ' Position data nodes |
代码说明:
我们现在有了一个对象,该对象包含了记录集中的所有数据行,它就是我们开始数据导航所需要的东西。我们可以使用XMLRSMoveFirst和XMLRSMoveNext函数进行数据导航。下面让我们仔细考察一下XMLRSMoveNext 函数:
| ' Check not EOF If Not XMLRSEOF() Then ' Increase pointer piRecordPos = piRecordPos + 1 End If |
为了理解整个程序逻辑,让我们看看XMLRSEOF函数:
| ' Check EOF If piRecordPos > poDataNodes.length - 1 Then XMLRSEOF = True |
现在,我们需要知道如何取出实际数据,完成这一工作的是XMLRS:
| ' Check if field number or field name If IsNumeric(FieldID) Then ' Get Field Data XMLRS = poDataNodes(piRecordPos).Attributes(FieldID).Text Else ' Get Field Data XMLRS = poDataNodes(piRecordPos).Attributes.getNamedItem(FieldID).Text End If |
正如您所看到的,我们可以提供一个字段名(就像我在窗体代码中所做的)以及一个字段序号
如需了解更多详细信息,我建议您认真阅读完整的示例的代码。
助你上路
您应该仔细分析XMLRS.bas模块,我在此只提供了几个必需的函数。以便您能很快上手。当然,我们还应该实现更多的ADO Recordset功能。因为该模块使用了XML DOM对象,您需要具有一些XML知识。
当然,这并不是一个解决这个问题的“企业级”解决方案。我希望ADOCE能在将来在Recordset(或者类似构造)中加入对XML的支持,这样就不用再使用XMLRS.bas模块了。如果容量发生了变化,只需对我提供的这些代码做一些小的修改即可,从而保护了您的前期投资和工作。
同时,如果您决定在该模块的基础上完成一些开发工作,您可以同我联系。我将利用您完成的增强版本对本文所介绍的示例代码进行升级。这将极大地增加您的知名度!
未来会怎样
我相信,在不远的将来,所有的.NET特性都将在Pocket PC得到应用。其中可能包括类似“连接断开”式ADO Recordsets和XML支持这样一些特性。我甚至相信,将ADO Recordset数据(XML)封装进SOAP调用这一过程对开发人员来说将是透明的。
您可以修改XMLRS.bas以使其适应新的XML数据集结构,您也可以简单地对代码进行升级,使用Recordset功能代替XMLRS中的函数。
小结
从任何地方对企业数据加以访问的能力所蕴藏的能量是异常巨大的。在多层解决方案(带有组件)中,您可以允许您的业务逻辑被世界各地的用户所使用,甚至是那些无线用户。