版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Web服務(wù)數(shù)據(jù)庫(kù)訪問(wèn)中間件的實(shí)現(xiàn)[日期:2006-05-23] 來(lái)源:作者: [字體:大中?。萃跣l(wèi)民郭鳴賀冬春井岡山學(xué)院計(jì)算機(jī)系摘要:本文分析現(xiàn)有的數(shù)據(jù)庫(kù)訪問(wèn)中間件的現(xiàn)狀,指出其中存在的問(wèn)題,得出應(yīng)用新技術(shù)的必要性。開(kāi)發(fā)了一個(gè)基于Web服務(wù)技術(shù)的數(shù)據(jù)庫(kù)訪問(wèn)中間件WSDBM,并以一個(gè)應(yīng)用實(shí)例驗(yàn)證了該中間件的有效性。關(guān)鍵詞:Web服務(wù);數(shù)據(jù)庫(kù)訪問(wèn)中間件;.Net1引言隨著Intranet/Internet網(wǎng)絡(luò)的迅猛發(fā)展,面向網(wǎng)絡(luò)的分布式數(shù)據(jù)庫(kù)成為支持Internet服務(wù)的關(guān)鍵,傳統(tǒng)的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)已漸漸不能滿足分布式應(yīng)用集成的需要⑴。利用新技術(shù),研究和開(kāi)發(fā)新的數(shù)據(jù)庫(kù)訪問(wèn)中間件成為數(shù)據(jù)庫(kù)研究領(lǐng)域的主要方向之一。Web服務(wù)是一種嶄新的分布式計(jì)算模型,基于一系列開(kāi)放的技術(shù)標(biāo)準(zhǔn),其松散耦合、語(yǔ)言中立、平臺(tái)無(wú)關(guān)性、開(kāi)放性使得它將成為下一代電子商務(wù)的架構(gòu),成為下一代的WWW⑵。Microsoft.Net提供了基于“.Net框架”的綜合開(kāi)發(fā)平臺(tái),它提供了涉及客戶端、服務(wù)器和服務(wù)的單獨(dú)、統(tǒng)一的編程模型。".Net框架”和VisualStudio.Net一起,給我們提供了一個(gè)完整的應(yīng)用程序開(kāi)發(fā)平臺(tái)。本文主要的工作就是在VisualStudio.Net平臺(tái)上,利用Web服務(wù)將現(xiàn)有的數(shù)據(jù)庫(kù)訪問(wèn)方式的封裝成中間件,使得封裝后的中間件可以滿足分布式應(yīng)用的需要。2Web服務(wù)中間件接口的定義現(xiàn)有通用的數(shù)據(jù)庫(kù)訪問(wèn)方式,它的主要操作有:設(shè)置數(shù)據(jù)庫(kù)連接,打開(kāi)和關(guān)閉數(shù)據(jù)庫(kù),執(zhí)行查詢和執(zhí)行其他的Sql語(yǔ)句,實(shí)現(xiàn)事務(wù)管理和緩沖池管理。比較先進(jìn)的數(shù)據(jù)庫(kù)訪問(wèn)方式還支持實(shí)時(shí)數(shù)據(jù)庫(kù)連接。因此,為了實(shí)現(xiàn)對(duì)傳統(tǒng)數(shù)據(jù)庫(kù)訪問(wèn)方式的封裝,我們首先要定義一個(gè)Web服務(wù),這個(gè)Web服務(wù)至少應(yīng)該擁有以上所列的Web方法(屬性為WebMethod的public函數(shù)成員)。這些方法就組成了這個(gè)Web服務(wù)的接口。.Net下,Web服務(wù)的實(shí)現(xiàn)都封裝在System.Web.Services.WebService這個(gè)類(lèi)中。為了實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)訪問(wèn)方式的Web服務(wù)的封裝,我們必須定義一個(gè)新的類(lèi),它繼承于WebService或是它的子類(lèi)。對(duì)于相對(duì)簡(jiǎn)單的Web服務(wù),我們直接讓這個(gè)類(lèi)繼承于WebServiceo這個(gè)生成的類(lèi)就成了一個(gè)具體的Web服務(wù)。.NET中新的關(guān)系型數(shù)據(jù)管理類(lèi)都是基于類(lèi)庫(kù)中System.Data的一系列的名稱(chēng)空間,通常稱(chēng)這些名稱(chēng)空間集合為ADO.NEToSystem.Data包含用來(lái)訪問(wèn)和存儲(chǔ)關(guān)系型數(shù)據(jù)的基礎(chǔ)對(duì)象。VisualStudio.Net直接給我們提供了System.Data.SqlClient和OleDBClient兩個(gè)命名空間,這兩個(gè)命名空間分別包含有用來(lái)訪問(wèn)SqlServer關(guān)系數(shù)據(jù)庫(kù)和其他關(guān)系數(shù)據(jù)庫(kù)所需的基本對(duì)象。其中以Transaction結(jié)尾的類(lèi)提供了事務(wù)管理的功能,以Connection結(jié)尾的類(lèi)用于連接具體的數(shù)據(jù)庫(kù)。以Command結(jié)尾的類(lèi)定義了對(duì)數(shù)據(jù)庫(kù)表的操作。3Web服務(wù)中間件的實(shí)現(xiàn)3.1實(shí)現(xiàn)框架下面是一個(gè)簡(jiǎn)單的Web服務(wù)中間件來(lái)實(shí)現(xiàn)(采用Microsoft推薦的c#語(yǔ)言來(lái)編寫(xiě))。為了實(shí)現(xiàn)中間件的可擴(kuò)展性,我們決定不在中間件的WebMethod(Web方法)中直接實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作。我們先定義一個(gè)虛類(lèi)DBOperator,在這個(gè)虛類(lèi)中定義了對(duì)數(shù)據(jù)庫(kù)操作的接口,包括數(shù)據(jù)庫(kù)的打開(kāi)(Open)和關(guān)閉(Close),事務(wù)的開(kāi)始(BeginTrans)、事務(wù)的遞交(CommitTrans)和回滾(RollbackTrans),沒(méi)有返回值的Sql語(yǔ)句的執(zhí)行(voidExecSql)和返回?cái)?shù)據(jù)集的Sql語(yǔ)句的執(zhí)行(DataSetExecSql)。這樣,我們的Web服務(wù)中間件的每個(gè)WebMethod就僅僅是調(diào)用了DBOperator對(duì)象的相應(yīng)的成員函數(shù)。比如Web服務(wù)中間件中的Open方法就是直接調(diào)用DBOperator對(duì)象的Open方法。3.2具體數(shù)據(jù)庫(kù)操作的實(shí)現(xiàn)為了具體實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作,我們需要定義DBOperator類(lèi)的子類(lèi),我們以SqlDBOperator為例,顯然SqlDBOperator具體實(shí)現(xiàn)了對(duì)SqlServer數(shù)據(jù)庫(kù)的操作。首先定義一個(gè)SqlDBOperator類(lèi),它繼承于DBOperator,并導(dǎo)入名稱(chēng)空間System.Data.SqlClient。usingSystem.Data.SqlClient;classSqlDBOperator:DBOperator其次添加私有的數(shù)據(jù)成員conn,trans,inTransaction,commprivateSqlConnectionconn;//數(shù)據(jù)庫(kù)連接privateSqlTransactiontrans;//事務(wù)處理類(lèi)privateboolinTransaction=false;〃指示當(dāng)前是否正處于事務(wù)中privateSqlCommandcomm;//數(shù)據(jù)庫(kù)操作命令處理類(lèi)然后我們開(kāi)始編寫(xiě)從DBOperator繼承下來(lái)的Open操作的實(shí)現(xiàn)語(yǔ)句。publicoverridevoidOpen(stringconnStr){〃如果連接是空的,就先通過(guò)connStr構(gòu)造一個(gè)連接if(conn==null)conn=SqlConnection(connStr);〃如果這個(gè)連接沒(méi)有打開(kāi),就打開(kāi)這個(gè)連接if(conn.State.ToString().ToUpper()!="OPEN")this.conn.Open();}在實(shí)現(xiàn)了Open(打開(kāi)數(shù)據(jù)庫(kù))操作的編寫(xiě)之后,我們開(kāi)始編寫(xiě)Close(關(guān)閉數(shù)據(jù)庫(kù))操作。publicoverridevoidClose(){〃如果連接是空的,則不用關(guān)閉if(conn==null)return;〃如果這個(gè)連接已經(jīng)打開(kāi),就關(guān)閉這個(gè)連接if(conn.State.ToString().ToUpper()=="OPEN")this.conn.Open();}事務(wù)處理功能的實(shí)現(xiàn):首先是BeginTrans(開(kāi)始事務(wù))操作的實(shí)現(xiàn)。publicoverridevoidBeginTrans(){〃如果連接是空的,則沒(méi)有事務(wù)可以開(kāi)始if(conn==null)return;/*開(kāi)始conn所屬的事務(wù),并將這個(gè)事務(wù)保存下來(lái),同時(shí)設(shè)置inTransaction(在事務(wù)中)標(biāo)志為true(真)。表示在進(jìn)行事務(wù)處理*/trans=conn.BeginTransaction();inTransaction=true;}接下來(lái)是CommitTrans(遞交事務(wù))操作的實(shí)現(xiàn)如下:publicoverridevoidCommitTrans(){trans.Commit();〃事務(wù)遞交inTransaction=false;//在事務(wù)中標(biāo)志變成false;}同理,RollbackTrans(回滾事務(wù))操作的實(shí)現(xiàn)如下:publicoverridevoidRollbackTrans(){trans.Rollback();//事務(wù)回滾inTransaction=false;//在事務(wù)中標(biāo)志變成false;}最后我們編寫(xiě)ExecSql(執(zhí)行Sql語(yǔ)句)操作的實(shí)現(xiàn):publicoverridevoidExeSql(stringstrSql,string[]strParams,object[]strValues){〃如果comm(處理Sql語(yǔ)句的對(duì)象)為空,則生成這個(gè)對(duì)象if(comm==null)comm=newSqlCommand();〃設(shè)置這個(gè)對(duì)象的連接conncomm.Connection=this.conn;//判斷是否在事務(wù)中,是就設(shè)置comm的事務(wù)對(duì)象屬性if(inTransaction)comm.Transaction=trans;//判斷參數(shù)個(gè)數(shù)和參數(shù)值個(gè)數(shù)是否相等,不等,就不能執(zhí)行這個(gè)Sql語(yǔ)句if((strParams!=null)&&(strParams.Length!=strValues.Length))thrownewException("查詢參數(shù)和值不對(duì)應(yīng)!");〃設(shè)置這個(gè)comm對(duì)象的命令文本comm.CommandText=strSql;//將參數(shù)名稱(chēng)和對(duì)應(yīng)的參數(shù)值保存到comm的參數(shù)數(shù)組中if(strParams!=null){for(inti=0;i<strParams.Length;comm.Parameters.Add(strParams[i],strValues[i]));〃執(zhí)行這個(gè)沒(méi)有返回值的查詢comm.ExecuteNonQuery();}下面是有返回值的ExecSql操作的實(shí)現(xiàn):publicoverrideDataSetExeSqlForDataSet(stringqueryString){〃如果comm(處理Sql語(yǔ)句的對(duì)象)為空,則生成這個(gè)對(duì)象if(comm==null)comm=newSqlCommand();〃設(shè)置這個(gè)對(duì)象的連接conncomm.Connection=this.conn;//判斷是否在事務(wù)中,是就設(shè)置comm的事務(wù)對(duì)象屬性if(inTransaction)comm.Transaction=trans;〃生成一個(gè)數(shù)據(jù)集(DataSet)對(duì)象(ds),用它來(lái)保存返回的查詢結(jié)果DataSetds=newDataSet();〃定義一個(gè)SqlDataAdpater類(lèi)的對(duì)象ad。SqlDataAdapterad=newSqlDataAdapter();〃設(shè)置這個(gè)comm對(duì)象的命令文本comm.CommandText=queryString;〃設(shè)置ad的SelectCommand屬性為commad.SelectCommand=comm;//ad執(zhí)行fill操作,結(jié)果保存到ds中ad.Fill(ds);//ds返回returnds;}4使用已定義的Web服務(wù)中間件來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的使用場(chǎng)合下面我們假設(shè)一種該中間件使用的具體情況:假設(shè)有一個(gè)私有的比較大型的書(shū)店,書(shū)店的老板家在離書(shū)店有一段距離,在書(shū)店和老板家之間架設(shè)局域網(wǎng)是不現(xiàn)實(shí)的,而老板需要在家里就可以使用書(shū)店的管理系統(tǒng),甚至進(jìn)行日常工作的管理。也就是說(shuō),老板需要實(shí)現(xiàn)在家里辦公。為此,書(shū)店老板決定讓某IT公司開(kāi)發(fā)這個(gè)系統(tǒng)。某IT公司在接到該書(shū)店老板提出的開(kāi)發(fā)意向后,在進(jìn)行初步的系統(tǒng)調(diào)研之后,決定接下這個(gè)IT訂單,由于這個(gè)書(shū)店老板并沒(méi)有提出具體的解決方案(他也不懂),所以IT公司人員思考了以下幾個(gè)開(kāi)發(fā)方案:在傳統(tǒng)的解決方案中,我們可以采用了動(dòng)態(tài)網(wǎng)頁(yè)的編程方法,也就是建立一個(gè)網(wǎng)站,這樣,在互聯(lián)網(wǎng)的任何地方,我都可以通過(guò)這個(gè)網(wǎng)站進(jìn)行訪問(wèn),這種實(shí)現(xiàn)方法非常優(yōu)秀,現(xiàn)有的很多公司門(mén)戶就是使用了這種技術(shù)實(shí)現(xiàn)的。但是這種技術(shù)有一個(gè)缺點(diǎn)是,書(shū)店需要有自己的Web服務(wù),這就增加了實(shí)現(xiàn)成本。同時(shí)這種方案的實(shí)現(xiàn)也拋棄了現(xiàn)有的解決方案(書(shū)店在建立初期就請(qǐng)某IT公司專(zhuān)門(mén)開(kāi)發(fā)一個(gè)專(zhuān)用的書(shū)店管理系統(tǒng)),拋棄這個(gè)Legacy(遺產(chǎn)),重新進(jìn)行設(shè)計(jì),書(shū)店老板也不愿意。另一個(gè)傳統(tǒng)的解決方案是利用Corba或DCOM進(jìn)行編程。原有系統(tǒng)就是利用VisualC++進(jìn)行編程的。所以可以選擇DCOM進(jìn)行編程,這也非常合理。但是這個(gè)方案限制了實(shí)現(xiàn)的平臺(tái),同時(shí)開(kāi)發(fā)費(fèi)用較高,畢竟利用DCOM進(jìn)行編程開(kāi)發(fā)和實(shí)現(xiàn)是一件比較復(fù)雜的工作。最后,公司決定利用Web服務(wù)技術(shù)封裝原有的數(shù)據(jù)庫(kù)訪問(wèn)層,這樣我們的客戶端僅需要進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn)層的修改。這樣,系統(tǒng)原來(lái)的界面不便,Business層(業(yè)務(wù)層)不變,改變的僅僅是客戶端的的數(shù)據(jù)庫(kù)訪問(wèn)層的實(shí)現(xiàn)。以上就是這個(gè)Web服務(wù)使用的具體場(chǎng)合。下面我們?cè)赩isualStudio.Net平臺(tái)上利用c#Windows應(yīng)用程序編程項(xiàng)目來(lái)說(shuō)明該Web服務(wù)的使用。首先新建一個(gè)C#Windows應(yīng)用程序項(xiàng)目,在窗體上添加控件,一個(gè)DataGrid和一個(gè)按鈕。然后添加Web引用,將該Web服務(wù)中間件所在的asmx文件地址添加到Web引用中。這樣我們就可以直接使用這個(gè)服務(wù)了。雙擊按鈕1,編程如下:〃新建一個(gè)Web服務(wù)的實(shí)例WebReference.ServiceWSDBMthe=newWindowsApplication1.WebReference.ServiceWSDBM();〃以數(shù)據(jù)庫(kù)連接字符串為參數(shù),打開(kāi)上面的連接字符串所可以連接的數(shù)據(jù)庫(kù)the.Open("Provider=SQLOLEDB.1;PersistSecurityInfo=False;UserID=sa;InitialCatalog=Northwind;UseProcedureforPrepare=1;AutoTranslate=True;PacketSize=4096;UseEncryptionforData=False;Tagwithcolumncollationwhenpossible=False");the.Open();〃對(duì)已經(jīng)打開(kāi)的數(shù)據(jù)庫(kù)進(jìn)行查詢操作,返回記錄集。System.Data.DataSetds=the.exeSqlForDataSet("select*fromproducts");//將查詢得到的記錄集顯示在DataGrid中dataGrid1.DataSource=ds;dataGrid1.DataMember=ds
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 部門(mén)個(gè)人工作計(jì)劃
- 2024年汽車(chē)電子設(shè)備銷(xiāo)售及維修合同3篇
- 2024年版魚(yú)塘租賃經(jīng)營(yíng)協(xié)議模板
- 2024年版離婚雙方權(quán)益保障合同模板版B版
- 小學(xué)教學(xué)計(jì)劃二年級(jí)
- 居住建筑及公共建筑建設(shè)項(xiàng)目節(jié)能評(píng)估報(bào)告書(shū)
- 2025年中國(guó)大黃提取物行業(yè)市場(chǎng)調(diào)研及未來(lái)發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 銷(xiāo)售客服工作計(jì)劃
- 2022初二語(yǔ)文教學(xué)工作計(jì)劃
- 行政文員個(gè)人工作報(bào)告
- 《公路工程集料試驗(yàn)規(guī)程》JTG-3432-2024考核試題及答案文檔
- 常見(jiàn)的排序算法-冒泡排序 課件 2023-2024學(xué)年浙教版(2019)高中信息技術(shù)選修1
- 農(nóng)貿(mào)市場(chǎng)安全生產(chǎn)
- (高清版)TDT 1031.6-2011 土地復(fù)墾方案編制規(guī)程 第6部分:建設(shè)項(xiàng)目
- 園林綠化工培訓(xùn)課件2
- 鄰里商業(yè)中心案例研究:方洲鄰里中心、新加坡
- 2024年02月上海滬劇藝術(shù)傳習(xí)所(上海滬劇院)招考聘用筆試近6年高頻考題難、易錯(cuò)點(diǎn)薈萃答案帶詳解附后
- 婚姻家庭關(guān)系心理講座
- 三叉苦種植技術(shù)規(guī)程-征求意見(jiàn)稿
- 七上-動(dòng)點(diǎn)、動(dòng)角問(wèn)題12道好題-解析
- 2024年九省聯(lián)考新高考 數(shù)學(xué)試卷(含答案解析)
評(píng)論
0/150
提交評(píng)論