成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何打造自己的數據訪問層三

數據庫
上一篇如何打造自己的數據訪問層二中,我們已具體實現了數據訪問層對應的功能,該進行收尾工作了。

上一篇如何打造自己的數據訪問層二中,我們已具體實現了數據訪問層對應的功能,該進行收尾工作了,先來看段代碼,試試上一篇實現的功能:

  1. string sqlText = "SELECT ID, NAME, VAL FROM TEST";  
  2. string columns = "ID, NAME, VAL";  
  3. DataSet ds = new DataSet();  
  4. DataExecutor execObj = new MSSqlExecutor();  
  5. DataMapping map = new DataMapping();  
  6. map.ExecuteObject = execObj;  
  7. map.TableName = "TEST";  
  8. map.KeyColumns = "ID";  
  9. map.Columns = "ID, NAME, VAL";  
  10. DataMapping map = new DataMapping(execObj.GetInstant(), "TEST""ID", columns);  
  11. map.Fill(sqlText, "TEST");  
  12. map.SetCommands(DataCommandType.Insert | DataCommandType.Update | DataCommandType.Delete, ds);  
  13. //DataTable方式進行增、刪、改  
  14. bool isSuccess = execObj.Update(); 

果然已經完成了對數據庫的讀寫操作了,至少不用再寫大段的參數傳遞代碼,功能都已經實現了,是不是就完成了?

仔細看看上面的代碼,實際上還有問題尚未解決,看看這句:

  1. DataExecutor execObj = new MSSqlExecutor(); 

竟然在代碼里直接實例化一個MSSql的執行對象,這樣一開始提出的數據庫之間的切換問題根本就沒有從本質上解決。

再回過頭來看上一篇,有一個方法public IDbConnection GetConn(),用來獲取數據連接對像,之前并沒有說明其如何實現。

我們知道DBConnection有兩個關鍵信息:

1、與哪種類型的數據庫產生連接,這個前面已經解決了。

2、傳遞與數據庫連接的帳號信息、訪問庫信息的ConnectionString,這個并沒有提及。

看看第二點以前是怎么做的:

  1. public IDbConnection GetConn()  
  2. {  
  3.     if (conn != null)  
  4.     {  
  5.         return conn;  
  6.     }  
  7.     conn = new SqlConnection();  
  8.     conn.ConnectionString = 連接字串;  
  9.     return conn;  

上面出現了連接字串,這個字串從哪來?

總結下,要完成最終的數據訪問輸出,還需要解決兩個問題:

1、動態進行不同數據庫之間的切換。

2、解決數據連接字串的來源問題。

接著就來解決這兩問題,先解決第二個問題,有個比較簡單的方法,將連接字串寫入配置文件中去,數據訪問層只需知道它傳遞過來KEY值:

  1. <appSettings>  
  2.     <add key="ConnStr" value="server=.;uid=sa;password=123456;database=DATA_BASE;max pool size=300"/>  
  3. </appSettings> 

***個問題解決了,只剩下***一個問題了,如何動態切換不同的數據庫,也就是說,在使用的時候不需要自己NEW一個對象,而是通過第三方來創建一個對象,實際上,設計模式里已提出了方案,創建型模式,有興趣的朋友可以自行研究,我們這里只需要用到簡單工廠模式:

  1. public sealed class ExecutorFactory  
  2. {  
  3.     public static DataExecutor Create()  
  4.     {  
  5.         return Create(DatabaseType.MSSql);  
  6.     }  
  7.     public static DataExecutor Create(DatabaseType dbType)  
  8.     {  
  9.         AbstractDataBase dataBase = null;  
  10.         Switch(dbType)  
  11.         {  
  12.             case DatabaseType.MSSql:  
  13.                 dataBase = new MSSqlDataBase();  
  14.                 break;  
  15.             case DatabaseType.Oracle:  
  16.                 dataBase = new OracleDataBase();  
  17.                 break;  
  18.         }  
  19.         return dataBase.Create();  
  20.     }  

現在可對這句代碼進行替換了:DataExecutor execObj = new MSSqlExecutor();

替換為:DataExecutor execObj = ExecutorFactory.Create();

至此,問題都解決了,切換數據庫是只需更改DatabaseType為相應的數庫類型。

接下來再考慮下,如果改變數據庫類型也不需要變動程序,能不能實現?

還是利用配置文件,只是此時提供的不是類型字串,而是實際的數據執行者程序集信息,再利用.NET的天然優勢反射可以實現了。
最終配置文件為:

  1. <appSettings>  
  2.     <add key="ConnStr" value="server=.;uid=sa;password=123456;database=DATA_BASE;max pool size=300"/>  
  3.     <add key="DBExecutor" value="FM.DataAccess, FM.DataAccess.MappingExcuter.MSSqlExecutor"></add>  
  4.   </appSettings> 

改造后的工廠:

  1. public sealed class ExecutorFactory  
  2.     {  
  3.         public static DataExecutor Create()  
  4.         {  
  5.             return Create(null);  
  6.         }  
  7.         public static DataExecutor Create(string dataBaseTypeKey)  
  8.         {  
  9.             return Create(dataBaseTypeKey, null);  
  10.         }  
  11.         public static DataExecutor Create(string dataBaseTypeKey, string connStrKey)  
  12.         {  
  13.             if (string.IsNullOrEmpty(dataBaseTypeKey))  
  14.             {  
  15.                 dataBaseTypeKey = "DBExecutor";  
  16.             }  
  17.             string[] sltDataBaseType = ConfigReader.Read(dataBaseTypeKey).Split(',');  
  18.             string asselblyName = sltDataBaseType[0];  
  19.             string nameSpace = sltDataBaseType[1].Trim();  
  20.             Assembly assembly = Assembly.Load(asselblyName);  
  21.             DataExecutor execObj = assembly.CreateInstance(nameSpace) as DataExecutor;  
  22.             execObj.SetConnectionString(connStrKey);  
  23.             return execObj;  
  24.         }  
  25.     } 

到此為止,數據訪問層最終完成,當然這里還有很多問題有待解決,但其基本框架已形成了,以此為依據,根據業務變化,實現自己的擴展,不斷更新,最終才能真正形成完善的數據訪問層。

原文鏈接:http://www.cnblogs.com/FlySoul/archive/2011/05/08/2040292.html

【編輯推薦】

  1. 曬曬我的通用數據訪問層
  2. 幾步走,教你創建簡單訪問數據庫方法
  3. 一句代碼實現批量數據綁定 下
  4. 一步一步設計你的數據庫1
  5. 不重復隨機數列生成算法
責任編輯:艾婧 來源: 博客園
相關推薦

2011-05-05 14:33:34

數據訪問層

2011-05-07 12:56:39

數據訪問

2012-08-15 11:03:18

框架項目

2009-01-08 09:52:26

2011-03-29 09:15:28

通用數據訪問層

2025-01-26 17:00:46

2012-01-11 09:46:31

DAL

2009-08-13 14:59:00

C#數據訪問層

2016-02-15 14:13:39

Python編碼環境

2023-07-27 08:16:51

數據訪問層項目

2013-11-26 09:47:47

ORM

2009-08-04 10:17:55

ASP.NET SqlASP.NET數據訪問

2009-08-19 10:54:42

ASP.NET數據訪問

2009-09-04 18:00:54

C#數據訪問層

2012-06-07 10:53:08

架構設計數據訪問層設計原則

2011-08-31 13:45:38

Demon CamipadiPhone

2020-12-14 08:09:03

弱口令工具掃描

2015-10-15 09:37:50

桌面環境發行版Linux

2011-04-27 11:12:07

2014-03-27 15:24:43

農行大數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费一区二区三区 | 欧美男男videos | 欧美黄色一区 | 亚洲精品久久久久久久久久吃药 | 欧美视频免费在线观看 | 一区二区在线看 | 亚洲日韩中文字幕一区 | 精品亚洲一区二区三区 | 91成人 | 久久精品aaa | 四虎成人精品永久免费av九九 | 午夜tv免费观看 | 中文字幕av在线一二三区 | 亚洲欧洲视频 | 黄网免费 | 成人在线播放网站 | 蜜桃av人人夜夜澡人人爽 | 中文字幕一区二区三 | 视频一区在线播放 | 午夜99| 久久久久久91香蕉国产 | 91久久夜色 | 亚洲一区在线播放 | 亚洲免费人成在线视频观看 | 亚洲综合二区 | 黑人精品欧美一区二区蜜桃 | 久久久91精品国产一区二区三区 | 亚洲成人福利视频 | 99精品在线 | 日日爱av| 亚洲精品中文字幕在线 | 亚洲黄色视屏 | 国产一级电影在线观看 | 国产日韩精品一区 | 亚洲一区二区视频 | 极品在线 | av黄色片在线观看 | 色呦呦网站 | 国产精品久久久久久久久久免费看 | 日日干日日操 | 日本精品视频在线观看 |