windows mobile 中使用Web Service连接数据库.docx
- 文档编号:3486785
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:18
- 大小:27.79KB
windows mobile 中使用Web Service连接数据库.docx
《windows mobile 中使用Web Service连接数据库.docx》由会员分享,可在线阅读,更多相关《windows mobile 中使用Web Service连接数据库.docx(18页珍藏版)》请在冰豆网上搜索。
windowsmobile中使用WebService连接数据库
在PocketPC中使用WebService连接数据库
前言
微软的移动开发者大会在六月的北京举行了,国内的移动应用软件虽然是刚刚起步,但是这个前景宽广的领域已经受到越来越多软件厂商的关注了。
移动设备上的商业应用尽管刚刚起步,但已经显示出巨大的发展潜力。
在微软移动开发挑战赛中,我的作品《饕餮元年无线餐饮管理系统》获得了商业应用的三等奖。
为了实现PocketPC与后台数据库服务器的连接,我的作品中使用了.NetCompactFramework和WebService技术,我将核心部分的实现原理拿出来与大家分享。
在本文中没有涉及《饕餮元年》的代码,我用另外一个程序“SQL查询分析器”作为演示的范例。
在嵌入式数据库领域,世界各大数据库厂商都提供了自己的移动解决方案,比如微软的SQLServerCE、Sybase的iAnywhere、IBM的DB2Everyplace等。
虽然各家厂商都提供了数据同步的解决方案,而且实现原理大同小异,但是,每种数据同步方案都针对自己的数据库,不能兼容其他的数据库产品。
那么有没有什么办法,可以通过一种机制来访问多种数据库呢?
微软的Mobile2003已经完全支持.netCompactFramework开发,而.net对WebService提供了很好的支持,开发者可以很容易的开发WebService的服务程序和客户端应用。
本文讨论的是在WindowsMobile2003平台上通过WebService来访问多种数据库的解决方案。
这肯定不会是移动设备访问多种远程数据库的最优解,但我希望这是利用现有技术实现的比较优秀的解决方案。
系统需求:
VisualStudio.NET2003
PocketPC2003模拟器
IIS5.0
第一个WebService
目前WebService受到了广泛的关注,主流的开发工具都为WebService开发提供了很好的支持。
我们在这里使用VisualStudio.NET2003来做一个简单的WebService实例,让不了解WebService开发的程序员更好的进入后续话题的讨论。
我们首先来创建一个ASP.NETWebService工程:
打开File菜单,选择New,然后是Project。
在NewProject对话框中,ProjectTypes选择“VisualC#Projects”,Templates中选择“ASP.NETWebService”。
Location中选择你的WebService的位置和名称,由于我的机器上配置了IIS服务,所以我将WebService直接部署在本机上。
请见图一。
ASP.NETWebService工程和ASP.NET十分相似,只是页面文件的扩展名为asmx,而不是aspx。
接下来,我们要为WebService创建一个WebMethod。
打开Service1.asmx.cs文件,在classService1中添加两个WebMethod:
YourName和welcom,代码如下(粗体字为添加的代码):
namespaceWebService1
{
publicclassService1:
System.Web.Services.WebService
{
……
[WebMethod]
publicstringYourName()
{
return"MyNameiswolf!
我就是老狼!
";
}
[WebMethod]
publicstringwelcom(stringyourname)
{
stringstr=yourname+",欢迎使用wolf的WebService";
returnstr;
}
}
}
这里需要提醒大家注意的是,每个WebMethod都必须是public的,而且需要在函数前
加上[WebMethod]的声明。
YourName函数返回一个包含英文和中文的string对象,主要是想测试一下WebService的字符串能否在支持Unicode的WindowsCE平台上正常现实。
Welcom函数增加了一个参数,目的也是为了测试WebService和WindowsCE平台间是否存在字符串不能正常显示的问题。
然后我们选择Debug菜单中的Start命令(或者按F5)运行这个WebService,出现如下界面:
(见图二)
可以看到,我们刚才编写的两个函数的名称被显示了出来。
大家可以点击函数名称,来查看WebMethod的SOAP和HTTPPOST等信息,还可以直接点击Invoke按钮,查看WebMethod返回的结果是否正确。
如果您的WebService工作一切正常,接下来,我们创建一个SmartDevice应用程序,在PocketPC2003环境下调用我们的WebService。
如果您对如何在VisualStudio.NET2003下如何创建SmartDevice应用程序还不是很了解,希望您参考下面的说明。
打开一个新的VS.NET的IDE环境,打开File菜单,选择New,然后是Project。
在NewProject对话框中,ProjectTypes选择“VisualC#Projects”,Templates中选择“SmartDeviceApplication”,然后点击OK。
在SmartDeviceApplicationWizard对话框中,有两个列表框。
上边一个列表框选择程序的目标平台,根据你开发使用机器上所安装的SDK的不同可以显示出不同的选项。
其中PocketPC中包括PocketPC2002和PocketPC2003;WindowsCE中包括其他支持.NETCompactFramework的WindowsCE平台。
如果您安装了SmartPhone的SDK,这里也会显示出SmartPhone的选项。
下面的对话框选择的是所创建的应用程序类型,包括Windows应用程序、类库、Non-graphical应用程序和空工程。
这里的选项根据您选择平台的不同也会略有差异。
还有一点需要说明的是,如果您安装了MobileInternetToolkit,您也可以通过这个向导来创建目标平台为Mobile设备的ASP.NETWeb程序。
我们在这里选择“PocketPC”和“WindowsApplication”,点击OK。
我们就可以开始移动开发之旅了。
我们先来看一下IDE环境的全景:
其实和WinForm程序的开发环境差不多吧。
但请大家注意上图中的下拉菜单,做过WindowsCE开发的朋友们一定很熟悉吧。
对了,这就是选择应用程序输出设备的菜单。
我们在这里选择“CHSPocketPC2003–SDKEmulator”,我们可以选择下拉菜单旁边的ConnectToDevice按钮来启动模拟器,也可以等到程序运行时再启动模拟器。
请注意:
VisualStudio.NET2003会默认安装PocketPC2002的SDK,您需要另外安装PocketPC2003SDK和中文映像才能够看到这一项。
不过您在PocketPC2002的模拟器下调试下面的应用程序也是没有问题的。
下面,我们来添加WebReferences,选择Project菜单下的“AddWebReferences”,或者在SolutionExplorer中右击WebReferences,在弹出菜单中选择“AddWebReferences”。
我们就会看到下面的对话框:
在URL里要填写WebService的URL,还记得我们运行WebService时IE地址栏中的URL吗?
http:
//localhost/WebService1/Service1.asmx。
对吗?
如果是WinForm程序,这样写是正确的,但在SmartDevice应用程序中,这样写就是错的。
请大家注意,下面讨论的话题十分重要:
WindowsCE设备的模拟器尽管运行在你的PC上,但它实际上是作为一台远程设备连接到你的PC上的。
所以,如果写“localhost”或者“127.0.0.1”,那么程序访问的将是模拟器,而不是你用来开发的PC机。
所以,在这里你必须填写你的PC在网络中的实际机器名或者IP地址。
所以这里应该填写http:
//yourname/WebService1/Service1.asmx(yourname表示你实际的机器名)。
这里如果您填写的是localhost,开发环境也将为你找到WebReferences,但在调用WebService时将出现异常。
好了,填写好URL,按GO按钮,如果URL正确,则会显示上图的信息,然后点击AddReferences按钮。
这样我们就可以在项目中使用这个WebService了。
我们打开界面编辑器,添加两个Button和一个TextBox,用来调用两个WebMethod。
代码如下:
privatevoidbutton1_Click(objectsender,System.EventArgse)
{
yourname.Service1myService=newyourname.Service1();
label1.Text=myService.YourName();
MessageBox.Show(myService.YourName());
}
privatevoidbutton2_Click(objectsender,System.EventArgse)
{
yourname.Service1myService=newyourname.Service1();
MessageBox.Show(myService.welcom(textBox1.Text));
}
yourname是WebService的名称,相当于命名空间,所以我们必须创建一个yourname中的Service1类的对象,然后调用Service1中的方法。
大家可以看到,在C#程序中调用WebServer的方法和创建本地类并调用其方法的过程是十分类似的。
另外需要说明的是,由于网络因素的影响,调用WebService不一定成功,所以在商业软件的开发中需要加入异常处理的代码,这里为了程序的简洁就省略了。
程序运行结果如下:
SQL查询分析器
在了解了基本的WebService的开发与调用之后,我们可以进入核心内容的讨论了。
WebService是基于XML语言的,正是这种特性才使WebService成为连接各种异构系统之间的桥梁。
那么有没有一种可以在跨越不同数据库来传递数据的简单方式呢?
ASP.NETWebService是支持返回DataSet对象的,而DataSet又能够被各种数据表示控件所支持,比如DataGrid等,DataSet就是我们要找的桥梁。
在这一部分里,我将创建一个SQL的查询分析器,与其他查询分析器不同的是,我可以在调用时再指定连接的数据库类型,这样就可以实现连接不同数据库了。
我们首先来创建SQL查询分析器的WebService部分:
先来看一下SQLService的UML图。
我们沿用了上面SQLService中的Service1类,并为它添加了五个WebMethod,其名称和功能介绍见下表:
名称
功能
SetDatabaseType
设置连接数据库的类型
SetDbConnectionString
设置数据库的连接字符串
Create
创建数据库操作对象
ExecuteNonQuery
执行不返回结果的SQL语句
ExecuteDataSet
执行SQL语句,并返回一个DataSet
在WebService的Service1类中,我们首先来声明三个变量用来分别存储数据库操作对象、数据库连接字符串和数据库类型。
注意,我们将变量声明为static,是为了让客户端执行不同的WebMethod时,可以访问到相同的数据库操作对象和字符串对象。
DBOperater是数据库操作类的基类,而等一下我们创建的是DBOperater派生类的实例。
privatestaticDBOperaterm_dbOperater;
privatestaticstringm_DatabaseType;
privatestaticstringm_DbConnectionString;
SetDatabaseType和SetDbConnectionString两个WebMethod是为了设置数据库类型和数据库连接字符串而提供的方法。
在这里需要特别提醒的是,将数据库的连接字符串作为WebService参数,以明文的方式在网络上传递是一种十分危险的做法,这里只是为了示例程序的简单才这样实现的。
强烈建议读者在实现自己的WebService时,用更好的方法来保护自己的数据库连接字符串。
[WebMethod]
publicboolSetDatabaseType(stringDatabaseType)
{
if(DatabaseType=="")
returnfalse;
m_DatabaseType=DatabaseType;
returntrue;
}
[WebMethod]
publicboolSetDbConnectionString(stringDbString)
{
if(DbString=="")
returnfalse;
m_DbConnectionString=DbString;
returntrue;
}
下面的Create方法,用来根据m_DatabaseType来创建相应的DBOperater派生类的对象。
这里需要说明的是,设置数据库类型(SetDatabaseType)用的是string作为参数,而没有使用enum类型或者其他类型,是为了再以后添加对新的数据库支持时不必修改已有的客户端源代码。
[WebMethod]
publicboolCreate()
{
if(m_DatabaseType=="SQLServer")
{
m_dbOperater=newDBSqlServerOperater(m_DbConnectionString);
returntrue;
}
if(m_DatabaseType=="Access")
{
m_dbOperater=newDBAccessOperater(m_DbConnectionString);
returntrue;
}
returnfalse;
}
而剩下的两个WebMethod只是简单的调用了DBOperater派生类对象的相应方法,而实际的数据库操作则是在DBOperater派生类中具体实现的。
这样可以更好地实现数据库操作与客户端操作的分离。
[WebMethod]
publicboolExecuteNonQuery(stringsql)
{
returnm_dbOperater.ExecuteNonQuery(sql);
}
[WebMethod]
publicDataSetExecuteDataSet(stringsql)
{
returnm_dbOperater.ExecuteDataSet(sql);
}
我们将对数据库操作的具体方法封装到了DBOperater类中,并由DBOperater类派生出了DBSqlServerOperater和DBAccessOperater类,分别用来进行对SqlServer数据库和Access数据库的操作。
DBOperater类暴露了两个虚方法:
ExecuteNonQuery()和ExecuteDataSet(),由派生类负责重载实现。
而派生类也各自暴露了自己的构造函数,用来获取连接数据库字符串。
下面是DBOperater类的实现代码,可以看到DBOperater类中的两个方法使用了virtual的关键字,声明为虚函数。
//数据库操作基类
publicclassDBOperater
{
publicvirtualboolExecuteNonQuery(stringsql)
{
returntrue;
}
publicvirtualDataSetExecuteDataSet(stringsql)
{
returnnull;
}
}
在WebService的体系结构中,真正进行数据库操作的只有DBOperater的派生类,我们下面看到的DBSqlServerOperater类,使用了System.Data.SqlClient命名空间中的数据库操作类,对SQLServer数据库进行存储操作。
DBAccessOperater类对OleDB数据进行操作,使用了System.Data.Oledb命名空间中的类。
//SQLServer操作类
publicclassDBSqlServerOperater:
DBOperater
{
publicDBSqlServerOperater(stringDBConnectionString)
{
m_SqlConnection=newSqlConnection(DBConnectionString);
}
publicoverrideboolExecuteNonQuery(stringsql)
{
if(sql=="")
returnfalse;
m_SqlConnection.Open();
SqlCommandcommand=m_SqlConnection.CreateCommand();
command.CommandText=sql;
command.ExecuteNonQuery();
m_SqlConnection.Close();
returntrue;
}
publicoverrideDataSetExecuteDataSet(stringsql)
{
if(sql=="")
returnnull;
m_SqlConnection.Open();
SqlDataAdapterda=newSqlDataAdapter(sql,m_SqlConnection);
DataSetds=newDataSet();
da.Fill(ds);
m_SqlConnection.Close();
returnds;
}
privateSqlConnectionm_SqlConnection;
}
//OleDb操作类
……
这里省略了与SQLServer操作类基本相同的Access操作类代码。
关于C#中重载和继承的实现方式和注意事项,请参阅相关书籍。
由于对数据库的操作已经在WebService端做了封装,所以客户端的代码实现起来就相对简单了。
SmartSQLClient包含两个属性页,第一个属性页为Setting,设置须查询的数据库类型和数据库连接字符串,设置完毕后,点击Setting按钮,程序会将数据库类型和连接字符串保存起来,并自动切换到第二个属性页中。
第二个属性页Query,包括一个textBox,用来书写SQL查询语句,一个DataGrid,用来显示WebService传来的数据库,两个Button分别执行返回DataSet的SQL查询和不返回结果集的操作。
现在我们来看一下ExecDataSet按钮的响应函数,该函数首先创建一个WebService访问对象的实例,然后根据Setting中的设置,设置数据库类型和数据库连接字符串,然后创建相应数据库操作类的对象实例,并调用WebService的ExecuteDataSet方法,将一个有效的SQL查询语句传递给WebService,WebService会返回一个DataSet对象,我们的客户端程序会将DataSet中的第一个表显示到DataGrid控件中。
privatevoidExecDsBtn_Click(objectsender,System.EventArgse)
{
wolf.Service1service=newSQLSmartClient.wolf.Service1();
service.SetDatabaseType(m_DatabaseType);
service.SetDbConnectionString(m_connectionString);
service.Create();
DataSetds=service.ExecuteDataSet(textBox1.Text);
dataGrid1.DataSource=ds.Tables[0];
}
好了,到这里,我们已经实现了一个可以在PDA端操作远程SQLServer和Access数据库的SQL查询分析器了。
随着.Net数据库操作组件的日益丰富,您完全可以实现对Oracle、DB2等流行的关系型数据库的支持,并在此基础上,实现更多基于移动设备的应用程序。
与SQLSERVERCE交互
我们上面实现的SQL查询分析器的意义不仅在于可以在移动设备上方便地对不同类型的数据库进行检索,而且这种WebService的方式还有更现实的意义。
众所周知,在WindowsCE平台上主流的数据库是SQLServerCE,SQLServerCE与服务器交换数据的方式主要有两种:
RemoteDataAccess(RDA)和Replication。
这两种数据同步的方式,不但需要搭建专门的IIS环境,而且只能与SQLServer数据库进行数据同步。
这就大大增加了使用其他类型数据库的系统集成商开发移动设备应用程序的难度,同时也不利于WindowsCE平台被更广泛的领域所接受。
下面的时间,我将在上面WebService的基础上,演示如何利用WebService实现SQLServerCE与Access之间的数据同步。
当然,我的实现还无法达到RDA可以将表结构同步复制的功能。
为了完成这部分的代码,我们在SQLSmartClient中再添加一个属性页,命名为SQLServerCE。
最上面的textBox和CreateDB按钮是为了创
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- windows mobile 中使用Web Service连接数据库 使用 Web Service 连接 数据库
![提示](https://static.bdocx.com/images/bang_tan.gif)