在Pocket PC中使用Web Service连接数据库

在 Pocket PC 中使用 Web Service 连接数据库

前言

微软的移动开发者大会在六月的北京举行了,国内的移动应用软件虽然是刚刚起步,但是这个前景宽广的领域已经受到越来越多软件厂商的关注了。移动设备上的商业应用尽管刚刚起步,但已经显示出巨大的发展潜力。

在微软移动开发挑战赛中,我的作品《饕餮元年无线餐饮管理系统》获得了商业应用的三等奖。为了实现 Pocket PC 与后台数据库服务器的连接,我的作品中使用了 .Net CompactFramework 和 Web Service 技术,我将核心部分的实现原理拿出来与大家分享。在本文中没有涉及《饕餮元年》的代码,我用另外一个程序“ SQL 查询分析器”作为演示的范例。

在嵌入式数据库领域,世界各大数据库厂商都提供了自己的移动解决方案,比如微软的 SQL Server CE 、 Sybase 的 iAnywhere 、 IBM 的 DB2 Everyplace 等。虽然各家厂商都提供了数据同步的解决方案,而且实现原理大同小异,但是,每种数据同步方案都针对自己的数据库,不能兼容其他的数据库产品。

那么有没有什么办法,可以通过一种机制来访问多种数据库呢?微软的 Mobile 2003 已经完全支持 .net Compact Framework 开发,而 .net 对 Web Service 提供了很好的支持,开发者可以很容易的开发 Web Service 的服务程序和客户端应用。

本文讨论的是在 Windows Mobile2003 平台上通过 Web Service 来访问多种数据库的解决方案。这肯定不会是移动设备访问多种远程数据库的最优解,但我希望这是利用现有技术实现的比较优秀的解决方案。

** 系统需求: ** Visual Studio .NET 2003

Pocket PC 2003 模拟器

IIS 5.0

第一个 Web Service

目前 Web Service 受到了广泛的关注,主流的开发工具都为 Web Service 开发提供了很好的支持。我们在这里使用 Visual Studio . NET 2003 来做一个简单的 Web Service 实例,让不了解 Web Service 开发的程序员更好的进入后续话题的讨论。

我们首先来创建一个 ASP.NET Web Service 工程:打开 File 菜单,选择 New ,然后是 Project 。在 New Project 对话框中, Project Types 选择“ Visual C# Projects ”, Templates 中选择“ ASP.NET Web Service ”。 Location 中选择你的 Web Service 的位置和名称,由于我的机器上配置了 IIS 服务,所以我将 Web Service 直接部署在本机上。请见图一。

ASP.NET Web Service 工程和 ASP.NET 十分相似,只是页面文件的扩展名为 asmx ,而不是 aspx 。接下来,我们要为 Web Service 创建一个 WebMethod 。打开 Service1.asmx.cs 文件,在 class Service1 中添加两个 WebMethod : ** YourName ** 和 ** welcom ** ,代码如下(粗体字为添加的代码):

namespace WebService1

{

public class Service1 : System.Web.Services.WebService

{

……

** [WebMethod] **

** public string YourName() **

** { **

** return "My Name is wolf!我就是老狼!"; **

** } **

** [WebMethod] **

** public string welcom( string yourname) **

** { **

** string str = yourname+",欢迎使用wolf的Web Service"; **

** return str; **

** } **

}

}


这里需要提醒大家注意的是,每个 WebMethod 都必须是 ** public ** 的,而且需要在函数前

加上 ** [WebMethod] ** 的声明。 ** YourName ** 函数返回一个包含英文和中文的 ** string ** 对象,主要是想测试一下 Web Service 的字符串能否在支持 Unicode 的 WindowsCE 平台上正常现实。 ** Welcom ** 函数增加了一个参数,目的也是为了测试 Web Service 和 WindowsCE 平台间是否存在字符串不能正常显示的问题。

然后我们选择 ** Debug ** 菜单中的 ** Start ** 命令(或者按 F5 )运行这个 Web Service ,出现如下界面:(见图二)

可以看到,我们刚才编写的两个函数的名称被显示了出来。大家可以点击函数名称,来查看 WebMethod 的 SOAP 和 HTTP POST 等信息,还可以直接点击 ** Invoke ** 按钮,查看 WebMethod 返回的结果是否正确。

如果您的 Web Service 工作一切正常,接下来,我们创建一个 Smart Device 应用程序,在 Pocket PC 2003 环境下调用我们的 Web Service 。如果您对如何在 Visual Studio .NET 2003 下如何创建 Smart Device 应用程序还不是很了解,希望您参考下面的说明。

打开一个新的 VS.NET 的 IDE 环境,打开 File 菜单,选择 New ,然后是 Project 。在 New Project 对话框中, Project Types 选择“ Visual C# Projects ”, Templates 中选择“ Smart Device Application ”,然后点击 OK 。

在 Smart Device Application Wizard 对话框中,有两个列表框。上边一个列表框选择程序的目标平台,根据你开发使用机器上所安装的 SDK 的不同可以显示出不同的选项。其中 Pocket PC 中包括 Pocket PC 2002 和 Pocket PC 2003 ; Windows CE 中包括其他支持 .NET Compact Framework 的 WindowsCE 平台。如果您安装了 SmartPhone 的 SDK ,这里也会显示出 SmartPhone 的选项。

下面的对话框选择的是所创建的应用程序类型,包括 Windows 应用程序、类库、 Non-graphical 应用程序和空工程。这里的选项根据您选择平台的不同也会略有差异。还有一点需要 说明 的是,如果您安装了 Mobile Internet Toolkit ,您也可以通过这个向导来创建目标平台为 Mobile 设备的 ASP.NET Web 程序。

我们在这里选择“ Pocket PC ”和“ Windows Application ”,点击 OK 。我们就可以开始移动开发之旅了。

我们先来看一下 IDE 环境的全景:其实和 WinForm 程序的开发环境差不多吧。但请大家注意上图中的下拉菜单,做过 WindowsCE 开发的朋友们一定很熟悉吧。对了,这就是选择应用程序输出设备的菜单。我们在这里选择“ CHS Pocket PC 2003 – SDK Emulator ”,我们可以选择下拉菜单旁边的 ** Connect To Device ** 按钮来启动模拟器,也可以等到程序运行时再启动模拟器。

** 请注意: ** Visual Studio .NET 2003 会默认安装 Pocket PC 2002 的 SDK ,您需要另外安装 Pocket PC 2003 SDK 和中文映像才能够看到这一项。不过您在 Pocket PC 2002 的模拟器下调试下面的应用程序也是没有问题的。

下面,我们来添加 Web References ,选择 Project 菜单下的“ Add Web References ”,或者在 Solution Explorer 中右击 Web References ,在弹出菜单中选择“ Add Web References ”。我们就会看到下面的对话框:

在 URL 里要填写 Web Service 的 URL ,还记得我们运行 Web Service 时 IE 地址栏中的 URL 吗? http://localhost/WebService1/Service1.asmx 。对吗?如果是 WinForm 程序,这样写是正确的,但在 Smart Device 应用程序中,这样写就是错的。请大家注意,下面讨论的话题 十分重要 : Windows CE 设备的模拟器尽管运行在你的 PC 上,但它实际上是作为一台远程设备连接到你的 PC 上的。所以,如果写“ localhost ”或者“ 127.0.0.1 ”,那么程序访问的将是模拟器,而不是你用来开发的 PC 机。所以,在这里你必须填写你的 PC 在网络中的实际机器名或者 IP 地址。所以这里应该填写 http://yourname/WebService1/Service1.asmx ( yourname 表示你实际的机器名)。这里如果您填写的是 ** localhost ** ,开发环境也将为你找到 Web References ,但在调用 Web Service 时将出现异常。好了,填写好 URL ,按 ** GO ** 按钮,如果 URL 正确,则会显示上图的信息,然后点击 ** Add References ** 按钮。这样我们就可以在项目中使用这个 Web Service 了。

我们打开界面编辑器,添加两个 Button 和一个 TextBox ,用来调用两个 WebMethod 。代码如下:

private void button1_Click( object sender, System.EventArgs e)

{

yourname.Service1 myService = new yourname.Service1();

label1.Text = myService.YourName();

MessageBox.Show(myService.YourName());

}

private void button2_Click( object sender, System.EventArgs e)

{

yourname.Service1 myService = new yourname.Service1();

MessageBox.Show(myService.welcom(textBox1.Text));

}


yourname 是 Web Service 的名称,相当于命名空间,所以我们必须创建一个 yourname 中的 Service1 类的对象,然后调用 Service1 中的方法。大家可以看到,在 C# 程序中调用 Web Server 的方法和创建本地类并调用其方法的过程是十分类似的。另外需要说明的是,由于网络因素的影响,调用 Web Service 不一定成功,所以在商业软件的开发中需要加入异常处理的代码,这里为了程序的简洁就省略了。程序运行结果如下:

SQL 查询分析器

在了解了基本的 Web Service 的开发与调用之后,我们可以进入核心内容的讨论了。 Web Service 是基于 XML 语言的,正是这种特性才使 Web Service 成为连接各种异构系统之间的桥梁。那么有没有一种可以在跨越不同数据库来传递数据的简单方式呢? ASP.NET Web Service 是支持返回 DataSet 对象的,而 DataSet 又能够被各种数据表示控件所支持,比如 DataGrid 等, DataSet 就是我们要找的桥梁。

在这一部分里,我将创建一个 SQL 的查询分析器,与其他查询分析器不同的是,我可以在调用时再指定连接的数据库类型,这样就可以实现连接不同数据库了。我们首先来创建 SQL 查询分析器的 Web Service 部分:

先来看一下 SQL Service 的 UML 图。我们沿用了上面 SQL Service 中的 Service1 类,并为它添加了五个 WebMethod ,其名称和功能介绍见下表:

** 名称 **

|

** 功能 **

---|---

<SPAN lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体; mso-hansi-font-family:

Published At
Categories with Web编程
Tagged with
comments powered by Disqus