走进数码网--数码时代的电脑应用专家首页·新闻·数码·硬件·摄友·产品·网络·术语·技巧·下载·卖场·答疑·笑话·读编·RSS·博客·论坛·繁體版
数码时尚频道首页频道首页·数码摄影·摄友部落·数字影像·随身音频·移动通讯·掌上天地·掌机娱乐·移动存储
数码下载 | 产品库 | 数码答疑 | 术语金典 | 卖场黄页 | 热点追踪 | 最新文章 | 推荐文章 | i论坛
 您现在的位置: 走进数码网 >> 数码时尚 >> 掌上天地 >> PDA应用 >> 数码正文
.NET的数据传输之道

发表日期:2005-5-21 来源:走进数码网 作者:怪鸭兽 阅读:
收藏至:新浪ViVi | 天天网摘 | 人人网摘 | 加加文摘 | YouNote书签 | 我摘网摘 | 博采中心 | 和讯网摘

本文向您介绍了如何使用Web Services和SOAP(Simple Object Access Protocol,简单对象反问协议)进行数据传输,并且通过讨论示例代码对在Pocket PC上传输数据的方法进行了仔细分析。

需要具备

  • Microsoft® eMbedded Visual Tools
  • Pocket PC上的有效Internet连接
  • 如果需要,您可以下载本文中所讨论的示例代码。为了创建测试示例代码所需的Web Services ,您需要下载SOAP Toolkit(SOAP Toolkit for Microsoft Visual Studio 6.0)

须知
SOAP规范(当前版本为1.1)仍然是一个处于提议状态的标准并且有可能发生变化。本文所提供的示例代码使用了当前处于提议状态的SOAP规范,在SOAP规范发生修改和变化时,本文中所提供的示例代码可能需要修改。

该示例代码使用了SDL(Services Description Language,服务描述语言)来定义Web Services,而SDL即将(有望在2001年的上半年)被最新的WSDL规范(Web Services Description Language,Web服务描述语言)所替代。本文中所提供的示例代码不能同使用WSDL规范的Web Services配合工作。

支持ADO(Microsoft ActiveX Data Objects)Recordset(我使用的是2.6版本)的XML格式可能会发生修改和变化,在XML格式发生变化时,本文提供的示例代码也可能需要相应修改。

支持的语言
英语

数据和Web Services
正如我在由我撰写的另一篇循序渐进文章“为Microsoft .NET做好准备”中所介绍的一样,您可以在当前SOAP规范的基础之上,使用Web Services为Pocket PC开发程序。

大多数的商业应用程序都需要在服务器和客户机应用程序之间传输数据。在一个传统的Microsoft Web解决方案平台(以前被称作Microsoft Windows DNA)中,一般使用ADO Recordset(ADO记录集)对象进行数据传输。因为它使用了一种特殊类型的“编组”(对象传输),它无需持有服务器上的任何“状态”(资源)即可被传输到客户端上。有鉴于此,很多现有系统中的组件都采用了这种实现方式,以ADO Recordsets形式返回数据。

如果我们又想利用在这些组件上的先前投资,又想获得应用程序同Web Services集成所带来的诸多益处,我们就需要找到一种通过SOAP传输这些ADO Recordsets的方法。在Chris Dengler所撰写的“利用SOAP消息返回ADO Recordset”这篇出色文章中,您可以为在个人计算机上使用Web Services找到一种解决方法。

但是,该解决方案不能被照搬到Pocket PC上,因为ADOCE(ActiveX Data Objects for CE)的实现方式同ADO有所不同。最重要的差别之处在于:ADOCE当前(3.1版)不支持持续性。特别是对于XML(扩展标记语言)格式。另一个不同之处在于:ADOCE不支持我前面所提到过的记录集编组。因此,它不能为动态创建“连接断开”(没有到数据源的活动连接)状态下的记录集提供支持。

无处不在的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
Dim ls As String
Dim litm As ListItem
Dim i As Integer
  
' Set parameters
lavParameters(1) = txtDSN.Text
lavParameters(2) = txtSQL.Text

' Make SOAP Call
ls = SOAPCall(txtURI.Text, "GetRecordset", lavParameters, chkShowPackets = 1)

' Clear and add ListView headings
lvwRecordset.ColumnHeaders.Clear
lvwRecordset.ColumnHeaders.Add 1, , "ArtNo", 700
lvwRecordset.ColumnHeaders.Add 2, , "Description", 1450
lvwRecordset.ColumnHeaders.Add 3, , "Price", 850, lvwColumnRight
      
' Clear and fill ListView from XML (with Recordset Emulation)
lvwRecordset.ListItems.Clear
XMLRSOpen ls
Do While Not XMLRSEOF
  Set litm = lvwRecordset.ListItems.Add(, , XMLRS("ArticleNo"))
  litm.SubItems(1) = XMLRS("Description")
  litm.SubItems(2) = XMLRS("Price")
   
  XMLRSMoveNext
Loop
XMLRSClose

代码说明:

传递给SOAP方法的两个参数(DNS和SQL)是从TextBox控件中取得的,其返回值是XML格式的ADO数据集。如需了解同SOAPCall函数及其参数有关的更详细信息,请参阅我的循序渐进文章“为Microsoft .NET做好准备”。

正如您看到的,整个实现方式类似于ADO Recordset的使用方式(简化了代码复用)。以“XMLRS…”开始的这些函数保存在XMLRS.bas模块,让我们深入到模块内部看一下。以下是XMLRSOpen 函数中的一部分代码:


' Create DOM object
Set poXML = CreateObject("Microsoft.XMLDOM")
  
' Load string
psXML = XML
  
' Load DOM
poXML.loadXML psXML

' Position data nodes
Set poDataNodes = poXML.documentElement.selectNodes("//rs:data")
Set poDataNodes = poDataNodes.Item(0).childnodes

代码说明:

  • psXML变量用来存放ADO Recordset 的XML表述。
  • PoXML变量是XML DOM对象,用来存放记录集数据。
  • PoDataNodes变量保存所有记录集数据行的XML元素。

我们现在有了一个对象,该对象包含了记录集中的所有数据行,它就是我们开始数据导航所需要的东西。我们可以使用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中的函数。

小结
从任何地方对企业数据加以访问的能力所蕴藏的能量是异常巨大的。在多层解决方案(带有组件)中,您可以允许您的业务逻辑被世界各地的用户所使用,甚至是那些无线用户。



【责任编辑:怪鸭兽】

发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
发表评论(评论内容只代表网友观点,与本站立场无关。)

姓名: * QQ:
性别:MSN:
E-mail: ICQ:
主页:评分:1分2分3分4分5分
内容:
·请遵守《互联网电子公告服务管理规定》《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他法律法规。
·用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
用户登录
站内搜索


文章资讯软件下载
摄友部落i 论 坛
相关文章
  • 启动 Media Player :一些关于外观的问题

  • 和 Money 2000 同步现有的 Money 数据

  • 如何移动和存储您最喜爱的音乐文件

  • 为便携设备准备 PowerPoint幻灯片

  • 创建功能设置的快捷方式

  • 放置快捷方式

  • 高速同步终极攻略

  • 通过 USB 端口进行同步

  • 转换数字音频格式

  • 设置 GSM/PCS

  • 图片文章
    热点文章
    关于我们 | 广告服务 | 投稿指南 | 人才招聘 | 隐私条款 | 会员注册 | 友情链接 | 意见反馈 | 网站地图
    走进数码网 走进宠物网 走进广告网 轻松网址导航
    Copyright © 2002-2005 走进宠物网 所有文章和图片版权所有
    未经授权禁止一切非法转载、摘编、复制或建立镜像,否则将追究其法律责任。
    京ICP备05055013号 68互联提供网络带宽