天天看點

建立資料庫Web Services

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應用程式,就可以分别得到我們剛才所舉的資料庫裡的資料了。如下圖所示: