本篇文章将说明如何从服务器上向客户端传送ADO.NET DataSet,服务器将通过一个Web服务传送DataSet(因此服务器需要安装有IIS),我们能够通过IE、Opera或Netscape Navigator等标准的互联网浏览器查看DataSet。另外,我们还会创建一个简单的Windows SmartClient,以演示如何接收DataSet,并在data grids等标准的Windows组件中使用它。
Web服务是什么?
Web服务能够轻易地解决当今困扰许多编程人员的根本性问题:即如何将信息由“这里”传送到“那里”。经过多年的发展,已经出现了多种在系统间传输数据的不同方式(包括FTP、ODBC、映射驱动器、DCOM等),但这些方法在解决易用性、开放性和可扩展性等问题方面都不如Web服务。Web服务的编写非常容易,它基于XML标准,可以以与IIS同样的方式进行扩展(通过在现有的硬件上添加更多的处理器或在服务器“农场”中添加服务器)。象COM对象那样,Web服务使我们能够创建逻辑块,供我们自己或别人使用。
多平台
尽管是由微软支持的,但Web服务决不是微软一家的技术。Web服务的一个优点是,它可以被其他的编程人员使用,而无需考虑他们所使用的平台(Mac、Unix, Linux, PocketPC等),所有的数据都是通过XML被发送到调用的系统的。在这种方式下,我们仍然可以选择使用VB.NET、C#、VB6等编程语言,而我们的商业伙伴可能使用的是PERL、PHP或Java与我们的系统相连。但在本篇文章中,我们将使用VB.NET编程语言。
在代码中标识Web服务
在VB.NET中将一个类标识为Web服务非常地简单,只要在类的定义前添加标识符即可。由于不要求对主代码进行任何变化,因此向开发Web服务的过渡相当地简单。
通过Web服务发送DataSet
使用Web服务发送ADO.NET数据与发送简单类型(例如字符串和整型)的数据一样简单。我们的数据可以来自数据库、XML文件或使用ADO.NET的高级数据构建命令在内存中构建的数据,在本篇文章中包括有各种情况的例子。读者需要清楚的是,每种方法都遵循着下面的基本模式:
Public Function theFunctionName() as DataSet
dim ds as DataSet
…
Return ds
End Function
从Access 2002中提取数据的例子:
Public Function ListPhoneNumbers_Access() As DataSet
Dim myConnection As OleDbConnection
Dim myDataAdapter As OleDbDataAdapter
Dim myDataSet As DataSet
myConnection = New OleDbConnection _
("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source=" + _
Server.MapPath("/") + "\PhoneNumbers\PhoneNumbers.mdb")
myDataAdapter = New _
OleDbDataAdapter("SELECT * FROM PhoneNumbers", myConnection)
myDataSet = New DataSet()
myDataAdapter.Fill(myDataSet, "PhoneNumbers")
Return myDataSet
End Function
从XML中提取DataSet的例子:
Public Function ListPhoneNumbers_XML() As DataSet
Dim ds As New DataSet()
ds.ReadXml((Server.MapPath("/") + _
"\PhoneNumbers\PhoneNumbers.xml"), XmlReadMode.InferSchema)
Return ds
End Function
通过编程方式提供DataSet:
Public Function ListPhoneNumbers_Default() As DataSet
Dim ds As DataSet = New DataSet()
Dim dt As DataTable = ds.Tables.Add("PhoneNumbers")
Dim newRow As DataRow
dt.Columns.Add("name")
dt.Columns.Add("home")
dt.Columns.Add("mobile")
dt.Columns.Add("netWorth")
newRow = dt.NewRow
newRow("name") = "Jeff Laughlin"
newRow("home") = "555-111-2222"
newRow("mobile") = "555-111-3333"
newRow("netWorth") = "Negligible"
dt.Rows.Add(newRow)
newRow = dt.NewRow
newRow("name") = "Bill Gates"
newRow("home") = "555-222-2222"
newRow("mobile") = "555-222-3333"
newRow("netWorth") = "33.6 Billion"
dt.Rows.Add(newRow)
newRow = dt.NewRow
newRow("name") = "Steve Balmer"
newRow("home") = "555-333-2222"
newRow("mobile") = "555-333-3333"
newRow("netWorth") = "15.1 Billion"
dt.Rows.Add(newRow)
Return ds
End Function
Web服务的部署
与传统的网站相似,尽管不是不会遇到任何问题,部署Web服务是相当简单的。
如果Web服务是通过Visual Studio.NET的集成环境开发的,则在本机上部署的问题都已经自动地解决了。如果想将自己的移植到其他的计算机上,可以选择使用Visual Studio.NET内置的向导工具重新部署自己的Web服务或者将Web服务的站点拷贝到其他计算机的一个文件夹中。如果选择了拷贝站点的方法,则我们还需要使用IIS MMC接口执行一个额外的步骤。我们需要将该文件夹标识为Virtual Directory Application,以便适当的配置能够得到ASP.NET处理器的处理。如果忘了将该文件夹指定为虚拟的目录应用,当在浏览器中加载URL时,就会得到下面的错误信息:
It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS。(这是一个在应用层次之外使用注册为allowDefinition='MachineToApplication'部件的错误,它可能是由没有在IIS中将虚拟目录配置为应用而引起的。)
Web服务的测试
Visual Studio.NET提供了一个只使用浏览器的非常简单的Web服务测试方法,在浏览器的地址栏输入ASMX文件的地址,连接到Web服务,并对代码进行测试。
http://localhost/PhoneNumbers/PhoneNumbers.asmx