蜗牛,在赛跑

--努力去改变吧
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如何创建数据库Web Services

Posted on 2007-04-14 13:32  body  阅读(460)  评论(0)    收藏  举报
WebService是什么?

其实WebService并不是什么神秘的东西,它就是一个可以远程调用的类,或者说是组件。

为什么要使用WebService?

WebService是一个新的概念,它并不是微软首先提出的,但是微软的dotnet战略让它最广泛的发挥它的潜能。也许它流行的根本原因并不是微软,也许是因为带宽与存储量的飞速发展,但是dotnet战略确实起到了很大的作用,令它能够在更加广泛的开发平台上施展。dotnet战略领导着微软前进,微软为了dotnet计划也花费了近300亿美元。为什么?因为微软要它的理念、方式不但在单机软件,甚至在Internet上也被最广泛的认同。WebService最早被应用在Sun等对网络先知先觉的平台上,并且在苦苦的期待发展。而J2EE是最早的成功开发WebService的平台,它的理念就是在网上最广泛的传播、使用,成为一种真正的服务。当微软的dotnet计划即将实施的时候,微软也开始发掘WebService的潜力。今天的 Web 站点仅能为浏览器提供用户界面,而下一代可编程 Web 站点直接将企业、应用程序、服务和设备彼此链接。这些可编程 Web 站点将不只是被动访问的站点,而将成为可重用的智能 Web 服务。因此我们要使用WebService才能适应将来的发展趋势。一句话:为了顺应时代的发展。

WebService有什么优势及劣势?

在早期的WebService开发中,由于带宽与存储容量的限制,令它并不被人关注。随着技术的发展,带宽与存储已经不成任何问题了,随便一条光纤就有1000M,家庭用的计算机都有160GB,更不要说服务器用的动辄就上TB的磁盘阵列了。然而,随着Internet的飞速发展,人们都应该感觉到网络给人们带来的新惊喜了,那就是网上办公。现在的网上办公系统是越做越先进,但是有一个通病——兼容性问题,因此沟通十分的困难,然而WebService则让人的沟通更加顺畅。打个比方:两国的人交流需要翻译,十分麻烦,因此不如统一两国的语言。而WebService就是这样的一个新的概念。WebService的发展时间很短,因此导致了一个问题——安全性。由于XML传输全部是明文传输,因此导致了安全性问题也不奇怪,但只需在要传输的数据上做点手脚就解决了。

WebService的开发

随着Visual Studio.net的发布,开发WebService的平台又增加了3个:C#、VB和JScript。它们都可以以ASP.Net为载体支持WebService。本文先介绍到这里,有关开发的技术下一次再讨论。


XML Web Services一个最显然的用处就是通用数据存取。通过它,你可以把公司的数据库被Internet上的许多客户端来访问,也可以动态地把它导入到第三方的Web站点上,甚至可以允许你的商业伙伴的Web Services去查询。下面就解释一下如何创建一个简单的Web Services,把你的数据库内容显示到Internet Explorer、第三方的Web Services和自定义的C#和VB.NET的客户端。

合作伙伴、客户、雇员在使用为多种设备设计的数据时已经有相当丰富的经验了,不管你现在的数据库是如何组织的,为了确保通用性,Web Services向客户端返回XML格式的数据。例如:假如一个物流公司(你的合作伙伴)准备把你的货物运送给你的客户,当运送车到达客户的门前时,他的PDA上显示出发送地址改变的信息,此时,运货车就很轻易地把它运送到别的地方去,那是因为你的客户在数据库里改变了他的地址,这种变化也自动地在你的合作伙伴的系统里自动更新了。

下面,就开始编写自己的ASP.NET数据库Web Services。首先,检查你的数据库,看它是否能够很轻易地就可以输出XML格式的数据,看看ADO.NET能否读出并进行动态转换。有些情况下,你可能需要对目前的数据库进行转换以满足这种需要。如果你的数据库访问代码变的很复杂,以致于会影响到伸缩性的情况,建议你对数据库进行转换。

为简单起见,这里假设例子中的数据库只有一个“Products”表。当然,你的数据库可能有许多表,也可能你的Web Services需要访问不止一个数据库。

现在,我们就可以开始写代码了。打开Visual Studio .NET,在DataBaseWebService目录下创建一个C#的ASP.NET Web Services项目,如图:



在Service1.asmx上点击右键,把Service1.asmx更名为DataBaseWebService.asmx,这个文件将会包含有从数据库得到数据的WebMethods,然后,点击右键,选择“查看代码”,切换到代码视图,更改为DataBaseWebService类和构造器的名字。

先在开始处引用.NET的类库:

程序代码 程序代码
 using System.Data.SqlClient;
using System.Data.OleDb;

然后更改类的名字为DataBaseWebService:

 public class DataBaseWebService : System.Web.Services.WebService
{
 public DataBaseWebService()
 {
   //CODEGEN:该调用是 ASP.NET Web 服务设计器所必需的
   InitializeComponent();
 }
 ...
}


在Hello World方法的结尾处写上自己的方法代码,第一个方法SQLDB用来访问SQL Server数据库,它处理客户端发送的SQL Server查询,SQLDB的参数从浏览器地址栏传送的查询语句,所有的WebMethod方法的代码都有try/catch语句,用来处理查询失败时输出一些错误信息。如果WebMethod方法在运行时出现例外,catch语句产生一个数据集,是一个包含错误信息的Error表。

SQLDB方法首先创建并打开SQL数据库连接,连接字符串在你的服务器上应当是唯一的,做为例子,我们使用Visual Studio .NET安装时自带的示例数据库;接下来,SQLDB方法创建SQL数据适配器,参数QUERY用来决定要返回的数据记录;最后产生查询结果的数据集,并一XML格式,并以Results为根节点的结果。代码如下:

程序代码 程序代码
 [WebMethod]
 public DataSet SQLDB(string Query)
 {
 try
 {
 SqlConnection CS = new SqlConnection
("server=(local)\\NetSDK;database=Northwind;Trusted_Connection=yes");
 SqlDataAdapter myCommand = new SqlDataAdapter (Query, CS);
 DataSet myDataSet = new DataSet();
 myCommand.Fill(myDataSet, "Results");
 return myDataSet;
 }
 catch(Exception ex)
 {
 return DataError(ex);
 }
 }

用来查询ACCESS数据库的方法与SQL基本相同,为了大家测试方便,全部代码如下:

程序代码 程序代码
 [WebMethod]
 public DataSet AccessDB(string Query)
 {
 try
 {
 string strAccessConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
 + this.Server.MapPath("AccessWebServices.mdb");
 OleDbConnection myAccessConn = new OleDbConnection(strAccessConn);
 OleDbCommand myAccessCommand = new OleDbCommand(Query,myAccessConn);
 OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);
 myAccessConn.Open();
 DataSet myDataSet = new DataSet();
 myDataAdapter.Fill(myDataSet,"Results");
 myAccessConn.Close();
 return myDataSet;
 }
 catch(Exception ex)
 {
 return DataError(ex);
 }
 }
最后写上处理错误的方法:

程序代码 程序代码
 public DataSet DataError(Exception ex)
 {
 DataSet errDS = new DataSet("Errors");
 DataTable errTable = errDS.Tables.Add("Error");
 errTable.Columns.Add("Message");
 errTable.Rows.Add(new Object[] {ex.Message});
 return errDS;
 }


现在,你就可以编译该项目了,看看你的Web Services是否能正常工作。如果能正常工作,结果将如下所示:




然后选择您的数据库类型,如下图所示:




选择AccessDB(注意:在进行此操作之前,请先建立数据库AccessWebServices.mdb,并建立表AcessTableTest,并放到DataBaseWebService目录之下),在Query里输入“select * from AcessTableTest”,然后点“Invoke”,你就会得到一个XML格式的查询结果,显示如下:




如果出现上图类似的结果,说明你的Web Services能够使用了。

如果再配合XSL,就可以产生可以浏览的HTML页面了,你也可以直接在地址栏里输入:http://localhost/DataBaseWebService/DataBaseWebService.asmx/AccessDB?Query=select+*+from+AcessTableTest得到想要的数据。

下面用C#写一个使用该Web Services的客户端应用程序。新建一个Windows应用程序的VS.NET项目,名为WebServicesClient,在解决方案浏览器上点右键,选择添加Web引用,在弹出的对话框里输入: 


http://localhost/DataBaseWebService/DataBaseWebService.asmx
然后点击“添加引用”,VS.NET就会把所需要的文件添加到你的项目里。在From1上添加菜单,并添加两个菜单项,“得到 SQL Server 产品列表”和“得到 Access 产品列表”,要使用我们刚才创建的Web Services,先创建Web Services的一个实例,如下所示:

 
程序代码 程序代码
private void menuItem1_Click(object sender,System.EventArgs e)
 {
 WebServicesClient.localhost.DataBaseWebService Database = 
new WebServicesClient.localhost.DataBaseWebService();
 DataSet ds = Database.SQLDB("select * from Products");
 dataGrid1.DataSource = ds.Tables[0];
 }
 private void menuItem2_Click(object sender,System.EventArgs e)
 {
 WebServicesClient.localhost.DataBaseWebService Database =
 new WebServicesClient.localhost.DataBaseWebService();
 DataSet ds = Database.AccessDB("select * from AcessTableTest");
 dataGrid1.DataSource = ds.Tables[0];
 }

最后,运行新建立的Window应用程序,就可以分别得到我们刚才所举的数据库里的数据了。如下图所示: