亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Web服務數據庫訪問中間件的實現

2019-11-18 16:49:21
字體:
來源:轉載
供稿:網友

摘要:本文分析現有的數據庫訪問中間件的現狀,指出其中存在的問題,得出應用新技術的必要性。開發了一個基于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服務實現數據庫訪問中間件將是一種比較有效的解決方案。

原文出處:http://www.ahcit.com/lanmuyd.asp?id=1153


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情网站在线观看| 欧美日韩免费区域视频在线观看| 精品国产一区二区三区久久久狼| 国产精品久久久久久搜索| 亚洲自拍偷拍在线| 成人免费看吃奶视频网站| 国产成+人+综合+亚洲欧美丁香花| 日韩成人在线视频| 国产精品嫩草影院一区二区| 91福利视频在线观看| 亚洲天堂网在线观看| 自拍视频国产精品| 日韩大片免费观看视频播放| 色噜噜国产精品视频一区二区| 久久乐国产精品| 国产一区二区三区四区福利| 欧美肥老妇视频| 欧美日韩国产综合视频在线观看中文| 在线视频日本亚洲性| www.欧美免费| 欧美亚洲另类激情另类| 国产精品久久久久久久久借妻| 日韩免费精品视频| 在线观看日韩视频| 亚洲一区二区在线播放| 日韩精品免费视频| 久久久久久网址| 国产精品麻豆va在线播放| 亚洲国产精品福利| 人体精品一二三区| 51视频国产精品一区二区| 亚洲电影免费观看高清完整版在线| 国产亚洲aⅴaaaaaa毛片| 国产91色在线|| 国产女精品视频网站免费| 欧美剧在线观看| 国产剧情久久久久久| 亚洲2020天天堂在线观看| 日本91av在线播放| 欧美性猛交xxxx富婆弯腰| 国产成人精品国内自产拍免费看| 国产主播喷水一区二区| 欧美性xxxxxxxxx| 亚洲国产天堂久久综合| 久久99久久99精品中文字幕| 国产精品mp4| 亚洲国产日韩欧美在线99| 亚洲国产成人久久综合一区| 国产91色在线播放| 国产一区二区动漫| 欧美专区在线视频| 欧美日韩激情视频8区| 日本乱人伦a精品| 亚洲香蕉av在线一区二区三区| 亚洲综合日韩在线| 91大神在线播放精品| 亚洲在线一区二区| 伊人久久久久久久久久| 久久香蕉国产线看观看av| 日韩免费av一区二区| 91精品久久久久| 国内外成人免费激情在线视频| 国产欧美日韩最新| 亚洲一区二区三区777| 国产精品中文字幕久久久| 久久高清视频免费| 正在播放欧美视频| 亚洲欧美国产视频| 亚洲区免费影片| 亚洲综合日韩在线| 日韩中文第一页| 国产成+人+综合+亚洲欧美丁香花| 欧美成人中文字幕在线| 欧美日韩在线看| 奇门遁甲1982国语版免费观看高清| 国产福利成人在线| 国产精品va在线播放我和闺蜜| 亚洲精品99久久久久中文字幕| 日韩电影免费在线观看中文字幕| 欧美一级黄色网| 伊人伊人伊人久久| 亚洲自拍欧美色图| 大胆欧美人体视频| 欧美一区二粉嫩精品国产一线天| 亚洲视频在线观看视频| 亚洲高清在线观看| 日韩一中文字幕| 欧美成人黑人xx视频免费观看| 国产丝袜一区二区三区| 欧美极品第一页| 国产精品视频导航| 91av在线视频观看| 亚洲黄在线观看| 国产日韩精品在线| 欧美大全免费观看电视剧大泉洋| 亚洲美女在线视频| 成人av番号网| 成人久久18免费网站图片| 日韩毛片中文字幕| 日韩欧美在线免费观看| 精品国产精品三级精品av网址| 中文字幕精品久久久久| 欧美亚洲视频在线观看| 黑人巨大精品欧美一区二区免费| 日韩有码在线播放| 68精品久久久久久欧美| 欧美成人免费播放| 久久久精品视频成人| 欲色天天网综合久久| 欧美高清视频在线观看| 欧美精品一区二区三区国产精品| 欧美一区二区大胆人体摄影专业网站| 国产精品第100页| 俺去亚洲欧洲欧美日韩| 亚洲一二在线观看| 久久视频在线播放| 国产精品一区二区三区久久| 日韩免费观看高清| 成人网在线免费观看| 亚洲综合中文字幕68页| 日韩中文字幕在线观看| 91午夜理伦私人影院| 久久夜色精品国产亚洲aⅴ| 亚洲毛片在线免费观看| 最近2019年好看中文字幕视频| 91av在线精品| 一区二区在线免费视频| 日韩欧美国产中文字幕| 色悠悠国产精品| 欧美一性一乱一交一视频| 精品人伦一区二区三区蜜桃免费| 国产精品99久久久久久www| 这里只有精品视频| 久久五月天综合| 欧美成人免费全部观看天天性色| 91av网站在线播放| 欧美日本啪啪无遮挡网站| 精品久久久久久电影| 欧美日韩加勒比精品一区| 亚洲最大av网| 国产日韩在线看片| 一区二区三欧美| 欧美专区日韩视频| 日韩中文字幕在线视频播放| 亚洲男人av在线| 久久久噜噜噜久久久| 欧美日韩激情网| 国产精品第一区| 成人久久久久久| 欧美有码在线观看| 欧美怡红院视频一区二区三区| 色婷婷综合成人| 日韩中文字幕国产精品| 亚洲视频欧美视频| 欧美黑人性生活视频| 中文字幕亚洲第一| 91久久精品国产91久久性色| 成人一区二区电影| 欧美精品在线观看91| 国产香蕉97碰碰久久人人| 国产精品99久久久久久久久久久久| 亚洲一区美女视频在线观看免费| 日日骚久久av| 欧美三级免费观看|