Web服務資料庫訪問中介軟體的實現

來源:互聯網
上載者:User
web|web服務|訪問|資料|資料庫

摘要:本文分析現有的資料庫訪問中介軟體的現狀,指出其中存在的問題,得出應用新技術的必要性。開發了一個基於Web服務技術的資料庫訪問中介軟體WSDBM,並以一個應用執行個體驗證了該中介軟體的有效性。
關鍵詞:Web服務;資料庫訪問中介軟體;.Net
 
1  引言
隨著Intranet/Internet網路的迅猛發展,面向網路的分散式資料庫成為支援Internet服務的關鍵,傳統的資料庫訪問技術已漸漸不能滿足分布式應用整合的需要。
【1】利用新技術,研究和開發新的資料庫訪問中介軟體成為資料庫研究領域的主要方向之一。
        Web服務是一種嶄新的分散式運算模型,基於一系列開放的技術標準,其鬆散耦合、語言中立、平台無關性、開放性使得它將成為下一代電子商務的架構,成為下一代的WWW。
【2】Microsoft.Net提供了基於“.Net架構”的綜合開發平台,它提供了涉及用戶端、伺服器和服務的單獨、統一的編程模型。
       “.Net架構”和Visual Studio.Net一起,給我們提供了一個完整的應用程式開發平台。
        本文主要的工作就是在Visual Studio.Net平台上,利用Web服務將現有的資料庫訪問方式的封裝成中介軟體,使得封裝後的中介軟體可以滿足分布式應用的需要。
 
2  Web服務中介軟體介面的定義
        現有通用的資料庫訪問方式,它的主要操作有:設定資料庫連接,開啟和關閉資料庫, 執行查詢和執行其他的Sql語句,實現交易管理和緩衝池管理。比較先進的資料庫訪問方式還支援即時資料庫串連。因此,為了實現對傳統資料庫訪問方式的封裝,我們首先要定義一個Web服務,這個Web服務至少應該擁有以上所列的Web方法(屬性為WebMethod的public函數成員)。這些方法就組成了這個Web服務的介面。
        .Net下,Web服務的實現都封裝在System.Web.Services.WebService這個類中。為了實現對資料庫訪問方式的Web服務的封裝,我們必須定義一個新的類,它繼承於WebService或是它的子類。對於相對簡單的Web服務,我們直接讓這個類繼承於WebService。這個產生的類就成了一個具體的Web服務。
        .NET中新的關係型資料管理類都是基於類庫中System.Data的一系列的名稱空間,通常稱這些名稱空間集合為ADO.NET。System . Data包含用來訪問和儲存關係型資料的基礎對象。Visual Studio.Net直接給我們提供了System.Data.SqlClient和OleDBClient兩個命名空間,這兩個命名空間分別包含有用來訪問Sql Server關聯式資料庫和其他關聯式資料庫所需的基本對象。其中以Transaction結尾的類提供了交易管理的功能,以Connection結尾的類用於串連具體的資料庫。以Command結尾的類定義了對資料庫表的操作。
 
3  Web服務中介軟體的實現
3.1實現架構
       下面是一個簡單的Web服務中介軟體來實現(採用Microsoft推薦的c #語言來編寫)。為了實現中介軟體的可擴充性,我們決定不在中介軟體的WebMethod(Web方法)中直接實現對資料庫的操作。我們先定義一個虛類DBOperator,在這個虛類中定義了對資料庫操作的介面,包括資料庫的開啟(Open)和關閉(Close),事務的開始(BeginTrans)、事務的遞交(CommitTrans)和復原(RollbackTrans),沒有傳回值的Sql語句的執行(void ExecSql)和返回資料集的Sql語句的執行(DataSet ExecSql)。這樣,我們的Web服務中介軟體的每個WebMethod就僅僅是調用了DBOperator對象的相應的成員函數。比如Web服務中介軟體中的Open方法就是直接調用DBOperator對象的Open方法。
3 .2具體資料庫操作的實現
       為了具體實現對資料庫的操作,我們需要定義DBOperator類的子類,我們以SqlDBOperator為例,顯然SqlDBOperator具體實現了對Sql Server資料庫的操作。

首先定義一個SqlDBOperator類,它繼承於DBOperator,並匯入名稱空間System . Data . SqlClient。
using System.Data.SqlClient;
class SqlDBOperator:DBOperator


其次添加私人的資料成員conn,trans,inTransaction,comm
private SqlConnection conn;        //資料庫連接
private SqlTransaction trans;     //交易處理類
private bool inTransaction=false; //指示當前是否正處於事務中
private SqlCommand comm;     //資料庫操作命令處理類

然後我們開始編寫從DBOperator繼承下來的Open操作的實現語句。
public override void Open(string connStr)
{
//如果串連是空的,就先通過connStr構造一個串連
if(conn==null)
conn=SqlConnection(connStr);
//如果這個串連沒有開啟,就開啟這個串連
if(conn.State.ToString().ToUpper()!="OPEN")
          this.conn.Open();
}


在實現了Open(開啟資料庫)操作的編寫之後,我們開始編寫Close(關閉資料庫)操作。
public override void Close()
{
//如果串連是空的,則不用關閉
if(conn==null)
return;
//如果這個串連已經開啟,就關閉這個串連
if(conn.State.ToString().ToUpper()=="OPEN")
          this.conn.Close();
}


交易處理功能的實現:首先是BeginTrans(開始事務)操作的實現。
public override void BeginTrans()
{
//如果串連是空的,則沒有事務可以開始
if(conn==null)
return;
/*開始conn所屬的事務,並將這個事務儲存下來,同時設定inTransaction(在事務中)標誌為true(真)。表示在進行交易處理*/
trans=conn.BeginTransaction() ;
inTransaction=true;
}


接下來是CommitTrans(遞交事務)操作的實現如下:
public override void CommitTrans()
{
trans.Commit(); //事務遞交
inTransaction=false;//在事務中標誌變成false;
}


同理,RollbackTrans(復原事務)操作的實現如下:
public override void RollbackTrans ()
{
trans.Rollback(); //交易回復
inTransaction=false;//在事務中標誌變成false;
}

最後我們編寫ExecSql(執行Sql語句)操作的實現:
public override void ExeSql(string strSql,string[] strParams,object[] strValues)
{
//如果comm(處理Sql語句的對象)為空白,則產生這個對象
if(comm==null)
comm=new SqlCommand();
     //設定這個對象的串連conn
   comm.Connection=this.conn ;
//判斷是否在事務中,是就設定comm的事務對象屬性
if(inTransaction)
    comm.Transaction=trans;
     //判斷參數個數和參數值個數是否相等,不等,就不能執行這個Sql語句
if((strParams!=null)&&(strParams.Length!=strValues.Length) )
          throw new Exception("查詢參數和值不對應!");
     //設定這個comm對象的命令文本
comm.CommandText=strSql;
   //將參數名稱和對應的參數值儲存到comm的參數數組中
if(strParams!=null)
     {
       for(int i=0;i<strParams.Length;comm.Parameters.Add(strParams[i],strValues[i]));
     }
     //執行這個沒有傳回值的查詢
    comm.ExecuteNonQuery();
}


下面是有傳回值的ExecSql操作的實現:
public override DataSet ExeSqlForDataSet(string queryString)
{
//如果comm(處理Sql語句的對象)為空白,則產生這個對象
if(comm==null)
comm=new SqlCommand();
     //設定這個對象的串連conn
   comm.Connection=this.conn ;
   //判斷是否在事務中,就是設定comm的事務對象屬性
if(inTransaction)
        comm.Transaction=trans;
     //產生一個資料集(DataSet)對象(ds),用它來儲存返回的查詢結果
DataSet ds = new DataSet();
//定義一個SqlDataAdpater類的對象ad。
   SqlDataAdapter ad = new SqlDataAdapter();
//設定這個comm對象的命令文本
comm.CommandText=queryString;
   //設定ad的SelectCommand屬性為comm。
         //SelectCommand是DataAdapter對象的一個屬性,表示Transact-SQL語句或預存程序,用於在資料來源中選擇記錄。
ad.SelectCommand =comm;
   //ad執行fill操作,結果儲存到ds中
ad.Fill(ds);
   //ds返回
return ds;
}
 
4 使用已定義的Web服務中介軟體來訪問資料庫的使用場合
下面我們假設一種該中介軟體使用的具體情況:
假設有一個私人的比較大型的書店,書店的老闆家在離書店有一段距離,在書店和老闆家之間架設區域網路是不現實的,而老闆需要在家裡就可以使用書店的管理系統,甚至進行日常工作的管理。也就是說,老闆需要實現在家裡辦公。為此,書店老闆決定讓某IT公司開發這個系統。
某IT公司在接到該書店老闆提出的開發意向後,在進行初步的系統調研之後,決定接下這個IT訂單,由於這個書店老闆並沒有提出具體的解決方案(他也不懂),所以IT公司人員思考了以下幾個開發方案:
在傳統的解決方案中,我們可以採用了動態網頁的編程方法,也就是建立一個網站,這樣,在互連網的任何地方,我都可以通過這個網站進行訪問,這種實現方法非常優秀,現有的很多公司入口網站就是使用了這種技術實現的。但是這種技術有一個缺點是,書店需要有自己的Web服務,這就增加了實現成本。同時這種方案的實現也拋棄了現有的解決方案(書店在建立初期就請某IT公司專門開發一個專用的書店管理系統),拋棄這個Legacy(遺產),重新進行設計,書店老闆也不願意。
另一個傳統的解決方案是利用Corba或DCOM進行編程。原有系統就是利用Visual C++進行編程的。所以可以選擇DCOM進行編程,這也非常合理。但是這個方案限制了實現的平台,同時開發費用較高,畢竟利用DCOM進行編程開發和實現是一件比較複雜的工作。
最後,公司決定利用Web服務技術封裝原有的資料庫訪問層,這樣我們的用戶端僅需要進行資料庫訪問層的修改。這樣,系統原來的介面不便,Business層(業務層)不變,改變的僅僅是用戶端的的資料庫訪問層的實現。以上就是這個Web服務使用的具體場合。
下面我們在Visual Studio.Net平台上利用c# Windows應用程式編程項目來說明該Web服務的使用。
首先建立一個C# Windows應用程式項目,在表單上添加控制項,一個DataGrid和一個按鈕。
然後添加Web引用,將該Web服務中介軟體所在的asmx檔案地址添加到Web引用中。這樣我們就可以直接使用這個服務了。
雙擊按鈕1,編程如下:
//建立一個Web服務的執行個體
WebReference.ServiceWSDBM the=new WindowsApplication1.WebReference.ServiceWSDBM();
//以資料庫連接字串為參數,開啟上面的連接字串所可以串連的資料庫
the.Open("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=Northwind;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False");
the.Open();
//對已經開啟的資料庫進行查詢操作,返回記錄集。
System.Data.DataSet ds=the.exeSqlForDataSet("select * from products");
//將查詢得到的記錄集顯示在DataGrid中
dataGrid1.DataSource=ds;
dataGrid1.DataMember=ds.Tables[0].TableName;
//關閉這個串連
the.Close();      
執行結果,在DataGrid中將顯示出串連上的Sql Server庫中的products表中的內容。
5 結束語
根據以上的介紹,基於Web服務實現的資料庫訪問中介軟體,可以擴充資料庫系統的應用範圍,這種中介軟體不僅適應於區域網路,更加適應於未來的基於廣域網路的應用程式。這個中介軟體於傳統中介軟體相比有以下優點: 1)跨平台。2)使用方便,可以將這個Web服務可以象本機群組件一樣被應用。3)相容性強,擴充方便,比如我們想要增加對Oracle的支援,僅需下載和Oracle有關的.Net外掛程式(下載地址:可到http://msdn.microsoft.com/downloads/上下載.Net Framework Data Provider for Oracle),然後將上述程式中的Sql替換為Oracle即可。綜上所述,基於Web服務實現資料庫訪問中介軟體將是一種比較有效解決方案。



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。