版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Web服務數(shù)據(jù)庫訪問中間件的實現(xiàn)[日期:2006-05-23] 來源:作者: [字體:大中?。萃跣l(wèi)民郭鳴賀冬春井岡山學院計算機系摘要:本文分析現(xiàn)有的數(shù)據(jù)庫訪問中間件的現(xiàn)狀,指出其中存在的問題,得出應用新技術的必要性。開發(fā)了一個基于Web服務技術的數(shù)據(jù)庫訪問中間件WSDBM,并以一個應用實例驗證了該中間件的有效性。關鍵詞:Web服務;數(shù)據(jù)庫訪問中間件;.Net1引言隨著Intranet/Internet網絡的迅猛發(fā)展,面向網絡的分布式數(shù)據(jù)庫成為支持Internet服務的關鍵,傳統(tǒng)的數(shù)據(jù)庫訪問技術已漸漸不能滿足分布式應用集成的需要⑴。利用新技術,研究和開發(fā)新的數(shù)據(jù)庫訪問中間件成為數(shù)據(jù)庫研究領域的主要方向之一。Web服務是一種嶄新的分布式計算模型,基于一系列開放的技術標準,其松散耦合、語言中立、平臺無關性、開放性使得它將成為下一代電子商務的架構,成為下一代的WWW⑵。Microsoft.Net提供了基于“.Net框架”的綜合開發(fā)平臺,它提供了涉及客戶端、服務器和服務的單獨、統(tǒng)一的編程模型。".Net框架”和VisualStudio.Net一起,給我們提供了一個完整的應用程序開發(fā)平臺。本文主要的工作就是在VisualStudio.Net平臺上,利用Web服務將現(xiàn)有的數(shù)據(jù)庫訪問方式的封裝成中間件,使得封裝后的中間件可以滿足分布式應用的需要。2Web服務中間件接口的定義現(xiàn)有通用的數(shù)據(jù)庫訪問方式,它的主要操作有:設置數(shù)據(jù)庫連接,打開和關閉數(shù)據(jù)庫,執(zhí)行查詢和執(zhí)行其他的Sql語句,實現(xiàn)事務管理和緩沖池管理。比較先進的數(shù)據(jù)庫訪問方式還支持實時數(shù)據(jù)庫連接。因此,為了實現(xiàn)對傳統(tǒng)數(shù)據(jù)庫訪問方式的封裝,我們首先要定義一個Web服務,這個Web服務至少應該擁有以上所列的Web方法(屬性為WebMethod的public函數(shù)成員)。這些方法就組成了這個Web服務的接口。.Net下,Web服務的實現(xiàn)都封裝在System.Web.Services.WebService這個類中。為了實現(xiàn)對數(shù)據(jù)庫訪問方式的Web服務的封裝,我們必須定義一個新的類,它繼承于WebService或是它的子類。對于相對簡單的Web服務,我們直接讓這個類繼承于WebServiceo這個生成的類就成了一個具體的Web服務。.NET中新的關系型數(shù)據(jù)管理類都是基于類庫中System.Data的一系列的名稱空間,通常稱這些名稱空間集合為ADO.NEToSystem.Data包含用來訪問和存儲關系型數(shù)據(jù)的基礎對象。VisualStudio.Net直接給我們提供了System.Data.SqlClient和OleDBClient兩個命名空間,這兩個命名空間分別包含有用來訪問SqlServer關系數(shù)據(jù)庫和其他關系數(shù)據(jù)庫所需的基本對象。其中以Transaction結尾的類提供了事務管理的功能,以Connection結尾的類用于連接具體的數(shù)據(jù)庫。以Command結尾的類定義了對數(shù)據(jù)庫表的操作。3Web服務中間件的實現(xiàn)3.1實現(xiàn)框架下面是一個簡單的Web服務中間件來實現(xiàn)(采用Microsoft推薦的c#語言來編寫)。為了實現(xiàn)中間件的可擴展性,我們決定不在中間件的WebMethod(Web方法)中直接實現(xiàn)對數(shù)據(jù)庫的操作。我們先定義一個虛類DBOperator,在這個虛類中定義了對數(shù)據(jù)庫操作的接口,包括數(shù)據(jù)庫的打開(Open)和關閉(Close),事務的開始(BeginTrans)、事務的遞交(CommitTrans)和回滾(RollbackTrans),沒有返回值的Sql語句的執(zhí)行(voidExecSql)和返回數(shù)據(jù)集的Sql語句的執(zhí)行(DataSetExecSql)。這樣,我們的Web服務中間件的每個WebMethod就僅僅是調用了DBOperator對象的相應的成員函數(shù)。比如Web服務中間件中的Open方法就是直接調用DBOperator對象的Open方法。3.2具體數(shù)據(jù)庫操作的實現(xiàn)為了具體實現(xiàn)對數(shù)據(jù)庫的操作,我們需要定義DBOperator類的子類,我們以SqlDBOperator為例,顯然SqlDBOperator具體實現(xiàn)了對SqlServer數(shù)據(jù)庫的操作。首先定義一個SqlDBOperator類,它繼承于DBOperator,并導入名稱空間System.Data.SqlClient。usingSystem.Data.SqlClient;classSqlDBOperator:DBOperator其次添加私有的數(shù)據(jù)成員conn,trans,inTransaction,commprivateSqlConnectionconn;//數(shù)據(jù)庫連接privateSqlTransactiontrans;//事務處理類privateboolinTransaction=false;〃指示當前是否正處于事務中privateSqlCommandcomm;//數(shù)據(jù)庫操作命令處理類然后我們開始編寫從DBOperator繼承下來的Open操作的實現(xiàn)語句。publicoverridevoidOpen(stringconnStr){〃如果連接是空的,就先通過connStr構造一個連接if(conn==null)conn=SqlConnection(connStr);〃如果這個連接沒有打開,就打開這個連接if(conn.State.ToString().ToUpper()!="OPEN")this.conn.Open();}在實現(xiàn)了Open(打開數(shù)據(jù)庫)操作的編寫之后,我們開始編寫Close(關閉數(shù)據(jù)庫)操作。publicoverridevoidClose(){〃如果連接是空的,則不用關閉if(conn==null)return;〃如果這個連接已經打開,就關閉這個連接if(conn.State.ToString().ToUpper()=="OPEN")this.conn.Open();}事務處理功能的實現(xiàn):首先是BeginTrans(開始事務)操作的實現(xiàn)。publicoverridevoidBeginTrans(){〃如果連接是空的,則沒有事務可以開始if(conn==null)return;/*開始conn所屬的事務,并將這個事務保存下來,同時設置inTransaction(在事務中)標志為true(真)。表示在進行事務處理*/trans=conn.BeginTransaction();inTransaction=true;}接下來是CommitTrans(遞交事務)操作的實現(xiàn)如下:publicoverridevoidCommitTrans(){trans.Commit();〃事務遞交inTransaction=false;//在事務中標志變成false;}同理,RollbackTrans(回滾事務)操作的實現(xiàn)如下:publicoverridevoidRollbackTrans(){trans.Rollback();//事務回滾inTransaction=false;//在事務中標志變成false;}最后我們編寫ExecSql(執(zhí)行Sql語句)操作的實現(xiàn):publicoverridevoidExeSql(stringstrSql,string[]strParams,object[]strValues){〃如果comm(處理Sql語句的對象)為空,則生成這個對象if(comm==null)comm=newSqlCommand();〃設置這個對象的連接conncomm.Connection=this.conn;//判斷是否在事務中,是就設置comm的事務對象屬性if(inTransaction)comm.Transaction=trans;//判斷參數(shù)個數(shù)和參數(shù)值個數(shù)是否相等,不等,就不能執(zhí)行這個Sql語句if((strParams!=null)&&(strParams.Length!=strValues.Length))thrownewException("查詢參數(shù)和值不對應!");〃設置這個comm對象的命令文本comm.CommandText=strSql;//將參數(shù)名稱和對應的參數(shù)值保存到comm的參數(shù)數(shù)組中if(strParams!=null){for(inti=0;i<strParams.Length;comm.Parameters.Add(strParams[i],strValues[i]));〃執(zhí)行這個沒有返回值的查詢comm.ExecuteNonQuery();}下面是有返回值的ExecSql操作的實現(xiàn):publicoverrideDataSetExeSqlForDataSet(stringqueryString){〃如果comm(處理Sql語句的對象)為空,則生成這個對象if(comm==null)comm=newSqlCommand();〃設置這個對象的連接conncomm.Connection=this.conn;//判斷是否在事務中,是就設置comm的事務對象屬性if(inTransaction)comm.Transaction=trans;〃生成一個數(shù)據(jù)集(DataSet)對象(ds),用它來保存返回的查詢結果DataSetds=newDataSet();〃定義一個SqlDataAdpater類的對象ad。SqlDataAdapterad=newSqlDataAdapter();〃設置這個comm對象的命令文本comm.CommandText=queryString;〃設置ad的SelectCommand屬性為commad.SelectCommand=comm;//ad執(zhí)行fill操作,結果保存到ds中ad.Fill(ds);//ds返回returnds;}4使用已定義的Web服務中間件來訪問數(shù)據(jù)庫的使用場合下面我們假設一種該中間件使用的具體情況:假設有一個私有的比較大型的書店,書店的老板家在離書店有一段距離,在書店和老板家之間架設局域網是不現(xiàn)實的,而老板需要在家里就可以使用書店的管理系統(tǒng),甚至進行日常工作的管理。也就是說,老板需要實現(xiàn)在家里辦公。為此,書店老板決定讓某IT公司開發(fā)這個系統(tǒng)。某IT公司在接到該書店老板提出的開發(fā)意向后,在進行初步的系統(tǒng)調研之后,決定接下這個IT訂單,由于這個書店老板并沒有提出具體的解決方案(他也不懂),所以IT公司人員思考了以下幾個開發(fā)方案:在傳統(tǒng)的解決方案中,我們可以采用了動態(tài)網頁的編程方法,也就是建立一個網站,這樣,在互聯(lián)網的任何地方,我都可以通過這個網站進行訪問,這種實現(xiàn)方法非常優(yōu)秀,現(xiàn)有的很多公司門戶就是使用了這種技術實現(xiàn)的。但是這種技術有一個缺點是,書店需要有自己的Web服務,這就增加了實現(xiàn)成本。同時這種方案的實現(xiàn)也拋棄了現(xiàn)有的解決方案(書店在建立初期就請某IT公司專門開發(fā)一個專用的書店管理系統(tǒng)),拋棄這個Legacy(遺產),重新進行設計,書店老板也不愿意。另一個傳統(tǒng)的解決方案是利用Corba或DCOM進行編程。原有系統(tǒng)就是利用VisualC++進行編程的。所以可以選擇DCOM進行編程,這也非常合理。但是這個方案限制了實現(xiàn)的平臺,同時開發(fā)費用較高,畢竟利用DCOM進行編程開發(fā)和實現(xiàn)是一件比較復雜的工作。最后,公司決定利用Web服務技術封裝原有的數(shù)據(jù)庫訪問層,這樣我們的客戶端僅需要進行數(shù)據(jù)庫訪問層的修改。這樣,系統(tǒng)原來的界面不便,Business層(業(yè)務層)不變,改變的僅僅是客戶端的的數(shù)據(jù)庫訪問層的實現(xiàn)。以上就是這個Web服務使用的具體場合。下面我們在VisualStudio.Net平臺上利用c#Windows應用程序編程項目來說明該Web服務的使用。首先新建一個C#Windows應用程序項目,在窗體上添加控件,一個DataGrid和一個按鈕。然后添加Web引用,將該Web服務中間件所在的asmx文件地址添加到Web引用中。這樣我們就可以直接使用這個服務了。雙擊按鈕1,編程如下:〃新建一個Web服務的實例WebReference.ServiceWSDBMthe=newWindowsApplication1.WebReference.ServiceWSDBM();〃以數(shù)據(jù)庫連接字符串為參數(shù),打開上面的連接字符串所可以連接的數(shù)據(jù)庫the.Open("Provider=SQLOLEDB.1;PersistSecurityInfo=False;UserID=sa;InitialCatalog=Northwind;UseProcedureforPrepare=1;AutoTranslate=True;PacketSize=4096;UseEncryptionforData=False;Tagwithcolumncollationwhenpossible=False");the.Open();〃對已經打開的數(shù)據(jù)庫進行查詢操作,返回記錄集。System.Data.DataSetds=the.exeSqlForDataSet("select*fromproducts");//將查詢得到的記錄集顯示在DataGrid中dataGrid1.DataSource=ds;dataGrid1.DataMember=ds
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024買賣房產合同樣本
- 女裝批量采購合同
- 醫(yī)院勞動合同書2024年
- 房屋合同法律效力分析
- 2024年小區(qū)物業(yè)管理系統(tǒng)合同
- 2024年度XX房地產營銷代理合同
- 工程代理加盟居間合同樣本
- 旅游客運車輛包車合同
- 2024代理商分銷合同探討與研究
- 2024養(yǎng)豬場荒山租賃合同
- 中外合作辦學規(guī)劃方案
- 廠房屋頂光伏分布式發(fā)電項目建議書
- 2024年人教版初一道德與法治上冊期中考試卷(附答案)
- 2024年第九屆“鵬程杯”六年級語文邀請賽試卷(復賽)
- 國開2024年《建筑結構#》形考作業(yè)1-4答案
- DL-T1475-2015電力安全工器具配置與存放技術要求
- 漏檢分析改善措施
- 新制定《公平競爭審查條例》學習課件
- TD/T 1060-2021 自然資源分等定級通則(正式版)
- 完整加快發(fā)展新質生產力課件
- 三位數(shù)除以兩位數(shù)300題-整除-有標準答案
評論
0/150
提交評論