国产毛片午夜福利,国产黄网,国产亚洲天堂,97国产精品

  •  
    對(duì)數(shù)據(jù)訪問層第一種實(shí)現(xiàn)(Acc+SQL)的重構(gòu)
    發(fā)布時(shí)間:2008-07-02   瀏覽次數(shù):1181486
    對(duì)數(shù)據(jù)訪問層種實(shí)現(xiàn)(Acc+SQL)的重構(gòu) 近日的文章基于.NET平臺(tái)的分層架構(gòu)實(shí)戰(zhàn)(七)——數(shù)據(jù)訪問層的種實(shí)現(xiàn):Access+SQL發(fā)布后,很多朋友對(duì)我的程序提出了意見和建議,在這里先謝謝你們。!尤其是金色海洋(jyk),對(duì)我的程序提出了很多建設(shè)性的意見。 我大體總結(jié)了一下,昨天程序的主要缺點(diǎn)有: 1.Connection對(duì)象沒有關(guān)閉 2.DataReader對(duì)象沒有關(guān)閉 3.相似代碼太多,造成代碼冗余。 其中點(diǎn)問題,目前還沒有太好的解決方案,主要是因?yàn)镃onnection一旦關(guān)閉,DataReader無法讀取了。而且,Connection對(duì)象應(yīng)該會(huì)自動(dòng)在適當(dāng)?shù)臅r(shí)候關(guān)閉(通過觀察臨時(shí)文件得出),并且在實(shí)際運(yùn)行時(shí)并無影響(在功能上),所以這里沒有專門解決。而針對(duì)后面兩個(gè)問題,我使用了如下解決方案。 對(duì)于關(guān)閉DataReader的方法,實(shí)現(xiàn)起來很簡(jiǎn)單,在finally里將他關(guān)閉行了。關(guān)鍵是如何去處冗余代碼。 經(jīng)過我的分析,數(shù)據(jù)訪問層的操作可以分為三類:不返回?cái)?shù)據(jù),返回單個(gè)實(shí)體類,返回實(shí)體類集合。我將這三種操作的公共部分抽出,寫成三個(gè)方法放在AccessDALHelper里,類型不同的問題使用泛型解決。 這樣做有一個(gè)難題,是不同實(shí)體在由DataReader轉(zhuǎn)化為實(shí)體類時(shí)的代碼很不一樣,無法抽出。這里,我使用了Strategy模式解決。具體做法是:首先定義一個(gè)由DataReader轉(zhuǎn)換為實(shí)體類的策略接口,然后為不同的實(shí)體編寫不同的轉(zhuǎn)換策略,示意圖如下:可以看出,所有轉(zhuǎn)換策略都要實(shí)現(xiàn)IDataReaderToEntityStrategy接口,并且每個(gè)策略都有一個(gè)自組合,這是以為他們都要實(shí)現(xiàn)Singleton模式。而AccessDALHelper與具體策略無關(guān),僅與接口耦合。 下面來看一下具體代碼: 首先是IDataReaderToEntityStrategy接口 IDataReaderToEntityStrategy1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Text;4usingSystem.Data;5usingSystem.Data.OleDb;67namespaceNGuestBook.AccessDAL8{9/**////10///由DataReader轉(zhuǎn)換成實(shí)體類的策略接口11///12publicinterfaceIDataReaderToEntityStrategy13{14/**////15///將DataReader轉(zhuǎn)換為實(shí)體類,采用泛型16///17///包含數(shù)據(jù)的DataReader對(duì)象18///實(shí)體類19TDataReaderToEntity(OleDbDataReaderdataReader);}21} 然后以Admin為例,看一下策略的具體實(shí)現(xiàn): 1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Web;4usingSystem.Web.Caching;5usingSystem.Configuration;6usingSystem.Data;7usingSystem.Data.OleDb;8usingNGuestBook.Utility;910namespaceNGuestBook.AccessDAL11{12/**////13///Access數(shù)據(jù)庫操作助手14///15publicsealedclassAccessDALHelper16{17/**////18///讀取Access數(shù)據(jù)庫的連接字符串19///首先從緩存里讀取,如果不存在則到配置文件中讀取,并放入緩存///21///Access數(shù)據(jù)庫的連接字符串22privatestaticstringGetConnectionString()23{24if(CacheAccess.GetFromCache("AccessConnectionString")!=null)25{26returnCacheAccess.GetFromCache("AccessConnectionString").ToString();27}28else29{30stringdbPath=ConfigurationManager.AppSettings["AccessPath"];31stringdbAbsolutePath=HttpContext.Current.Server.MapPath(dbPath);32stringconnectionString=ConfigurationManager.AppSettings["AccessConnectionString"];3334CacheDependencyfileDependency=newCacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));35CacheAccess.SaveToCache("AccessConnectionString",connectionString.Replace("{DBPath}",dbAbsolutePath),fileDependency);3637returnconnectionString.Replace("{DBPath}",dbAbsolutePath);38}39}4041/**////42///執(zhí)行SQL語句并且不返回任何值43///44///所執(zhí)行的SQL命令45///參數(shù)集合46publicstaticvoidExecuteSQLNonQuery(stringSQLCommand,OleDbParameter[]parameters)47{48OleDbConnectionconnection=newOleDbConnection(GetConnectionString());49OleDbCommandcommand=newOleDbCommand(SQLCommand,connection);5051for(inti=0;i{69OleDbConnectionconnection=newOleDbConnection(GetConnectionString());70OleDbCommandcommand=newOleDbCommand(SQLCommand,connection);7172for(inti=0;i{69OleDbConnectionconnection=newOleDbConnection(GetConnectionString());70OleDbCommandcommand=newOleDbCommand(SQLCommand,connection);7172for(inti=0;i
    立即預(yù)約