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

自然框架之數據訪問

數據庫 SQL Server
筆者從2004年開始用自己的數據訪問,一直到現在,經歷過改版,也增加了不少的功能。寫下這篇文章的目的整理思路、整理代碼;另外一個,是告訴我們【自然框架】的數據訪問 —— 再小的類庫也需要設計。

以前也寫過幾篇關于數據訪問的,這里是***的總結。麻雀雖小五臟俱全,數據訪問也許不起眼,但是也要好好的設計一翻。從2004年開始用自己的數據訪問,一直到現在,經歷過兩次大的改版,隨著需求的變化,也增加了不少的功能,小修小改那就更多了。目的就是能夠讓自己更輕松一點。整理思路、整理代碼,寫點東西,一個是給自己留個腳印;另外一個,說不定也許能夠給大家幫個小忙。

目標:

簡單、好用、易擴展、穩定、性能。

特點:

  1. 基于ADO.net 2.0 編寫,理論上可以支持多種數據庫,目前測試了SQL Server 和Access,一位朋友幫忙測試了MySQL。Orcale等其他數據庫沒有測試過。
  2. 使用非常簡單。
  3. 支持事務、存儲過程、參數化SQL等。
  4. 對存儲過程的參數進行封裝,更便于操作和更換數據庫。
  5. 如果運行是出現異常,可以把異常信息、出錯的SQL保存到文本文件里面,便于調試、修改錯誤。
  6. 可以方便的擴展相關功能,遵循關閉開放原則。

不承擔的責任:

不對SQL語句進行檢查。

不負責防止SQL注入。

不負責分頁。

圖示:

結構:

1、 兩個工廠

CommonFactory:生成Db系列的實例,比如DbConnection、DbCommand等。內部使用。他們都是抽象基類不能直接new,需要相應的子類的實例,比如new SqlConnection、new SqlCommand等。這個就需要根據當前的需求(驅動類型)來確定了,也就是這個工廠的職責。
DALFactory:調用者使用的工廠,通過這個工廠,根據數據驅動類型,生成數據訪問的實例。

2、 主體部分

DataAccessLibrary:這個是數據訪問的核心部分,相當于大樹的主干。定義了一個DbCommand Command,通過他來實現各種功能。

主體部分僅實現最基本的功能,定義內部結構、成員,實現輸入和輸出的功能。

輸入主要是ExecuteNonQuery。通過他來傳遞添加、修改、刪除的SQL語句(包括參數化SQL和存儲過程)。還有一個 ExecuteExists,用來判斷數據庫里是否存在指定的記錄。

輸出部分主要是ExecuteReader,這個大家都不陌生吧。其他的原則上都是通過擴展(配件)的方式來實現,不過為了便于調用,還是增加了ExecuteString、T ExecuteScalar<T>(string text)兩個函數。這個對于我來說比較常用,所以就放在主體部分里面了。

另外可以通過子類來實現支持不同數據庫的差異的部分。

3、 配件部分

這個就比較多了,比如對事務的處理、對存儲過程的參數的封裝、對Json 的處理、對添加、修改用SQL(包括參數化SQL)的處理等。每一個都是一個“配件”,這樣就可以通過增加配件的方式增加需要的功能。比如以前是不支持Json格式的記錄的,但是想玩玩ajax,選擇json來傳遞數據,那么就需要把提取出來的數據轉換Json格式。那么就可以增加一個“配件”,就是增加一個類,而不影響其他代碼。

增加功能,并不影響其他的代碼,這個就是對擴展開放,對修改關閉。

實例

  1. //發回復    
  2. Reply.bodyUBB = Request.Form["Editor"];    
  3. Reply.topicID = int.Parse(this.DataID);    
  4. #region 驗證信息    
  5. if (Reply.bodyUBB.Length < 10)    
  6. {    
  7.     Functions.PageRegisterAlert(Page, "請填寫內容,或者內容太短!至少也得寫10個字,對吧。");    
  8.     return;    
  9. }    
  10.  
  11. #endregion    
  12. #region 內部字段    
  13. int userID = int.Parse(UserInfo.UserID);    
  14. string ip = Request.UserHostAddress;    
  15. DateTime dateTime = DateTime.Now;    
  16. string bodyHTML;    
  17. #endregion    
  18. #region 處理UBB    
  19. bodyHTML = bodyUBB.Replace("\r", "<BR>");    
  20. //其他略    
  21. #endregion    
  22. //開啟事務    
  23. Dal.ManagerTran.TranBegin();    
  24. ManagerParameter parm = Dal.ManagerParameter;    
  25. #region 設置參數    
  26. parm.ClearParameter();    
  27. parm.AddNewInParameter("TopicID", Reply.topicID);        //     
  28. parm.AddNewInParameter("回復內容", bodyUBB);    
  29. parm.AddNewInParameter("內容HTML", bodyHTML);    
  30. parm.AddNewInParameter("回復人ID", userID);    
  31. parm.AddNewInParameter("回復人IP", ip, 15);    
  32. parm.AddNewInParameter("回復時間", dateTime);    
  33. #endregion                  
  34. #region 保存回復,表名:BBS_Reply    
  35. Dal.ModifyData.InsertData("BBS_Reply");    
  36. if (Dal.ErrorMessage.Length > 0)    
  37. {    
  38.     //出現異常    
  39.     Functions.PageRegisterAlert(Page, "保存您發的回復的時候出現意外情況!");    
  40.     return;    
  41. }    
  42. #endregion    
  43. string sql;    
  44. #region 更新回復人的回復數量,回復時間,以及各種積分。    
  45. sql = @"update BBS_Topic set 回復次數 = 回復次數 + 1 ,***回復時間 = GetDate(),    
  46. ***回復人ID = {0},   where TopicID ={1}";    
  47. Dal.ExecuteNonQuery(string.Format(sql, userID,topicID));    
  48. if (Dal.ErrorMessage.Length > 0)    
  49. {    
  50.     //出現異常    
  51.     Functions.PageRegisterAlert(Page, "更新回復數量的時候出現意外情況!");    
  52.     return;    
  53. }    
  54. #endregion    
  55. #region 更新回復人的參與討論的帖子    
  56. sql = "select top 1 UserInTopicID from BBS_UserInTopic where UserID ={0} and TopicID={1} ";    
  57. string userInTopicID = Dal.ExecuteString(string.Format(sql, userID, topicID));    
  58. sql = "select top 1 回復次數 from BBS_Topic where TopicID={0} ";    
  59. string reCount = Dal.ExecuteString(string.Format(sql, topicID)) ?? "0";    
  60. int intintReCount = int.Parse(reCount);    
  61. if (userInTopicID == null)    
  62. {    
  63.     #region 沒有參與過,添加記錄    
  64.     parm.ClearParameter();    
  65.     parm.AddNewInParameter("UserID", userID);    
  66.     parm.AddNewInParameter("TopicID", topicID);    
  67.     parm.AddNewInParameter("***查看時間", dateTime);    
  68.     parm.AddNewInParameter("***查看回復數", intReCount);    
  69.     Dal.ModifyData.InsertData("BBS_UserInTopic");    
  70.     if (Dal.ErrorMessage.Length > 0)    
  71.     {    
  72.         //出現異常    
  73.         Functions.PageRegisterAlert(Page, "增加您參與討論的帖子的時候出現意外情況!");    
  74.         return;    
  75.     }    
  76.     #endregion    
  77. }    
  78. else   
  79.  
  80. {    
  81.     #region 參與過,修改記錄    
  82.     parm.ClearParameter();    
  83.     parm.AddNewInParameter("***查看時間", dateTime);    
  84.     parm.AddNewInParameter("***查看回復數", intReCount);    
  85.     Dal.ModifyData.UpdateData("BBS_UserInTopic", "UserInTopicID=" + userInTopicID);    
  86.     if (Dal.ErrorMessage.Length > 0)    
  87.     {    
  88.         //出現異常    
  89.         Functions.PageRegisterAlert(Page, "更新參與討論的帖子的時候出現意外情況!");    
  90.         return;    
  91.     }    
  92.     #endregion    
  93. }    
  94. #endregion    
  95. //提交事務    
  96. Dal.ManagerTran.TranCommit();    
  97. //正常    
  98. lblMsg.Text = "發表回復成功!感謝您的參與!1秒后重新加載帖子。";    
  99. Functions.PageRegisterJavascript(Page, "reload()");    

簡單寫一個,以論壇的回復為例,這個大家都熟悉,不是太簡單也不是很復雜。

這個沒有按照三層的方式來寫,因為我分不出來哪些是業務邏輯,哪些是數據訪問,都寫到一起了,呵呵。但是這并不是說數據訪問只能寫成這個樣子。這個只是一個具體的、綜合性的例子。也可以把他分一分,找到業務邏輯的部分,提取出去,放在業務層;把數據訪問的部分也提出出去,放在數據層。

這里僅僅是一個數據訪問的調用的示例,并不是說要不要分層。

原文出處:http://www.cnblogs.com/jyk/archive/2011/03/28/1998254.html

【編輯推薦】

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

2011-04-22 10:50:18

SimpleFrame

2011-03-03 11:07:57

Spring數據庫訪問ORM

2018-07-13 09:20:30

SQLite數據庫存儲

2011-11-14 10:41:15

Winform數據管理模塊Items

2017-04-28 08:13:08

大數據框架HDFS

2019-04-08 17:11:46

大數據框架Spark

2021-12-30 08:17:27

Springboot數據訪問DataSourceB

2021-05-18 07:15:37

Python

2021-09-15 08:09:43

前端技術編程

2021-09-03 12:01:07

模型自然語言

2024-06-18 13:17:02

數據庫框架

2019-06-13 11:50:41

Python面向對象編程語言

2025-05-27 02:25:00

Spring框架接口

2009-10-29 17:33:51

VB.NET線程方法

2011-11-02 09:01:30

系統架構師

2022-06-07 07:58:45

SpringSpring AOP

2022-05-27 08:25:55

容器Spring

2016-03-23 11:05:58

Socket開發框架分析

2011-06-20 10:19:27

2021-07-09 13:54:31

零信任網絡安全網絡攻擊
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产午夜在线 | 亚洲va中文字幕 | 国产精品视频999 | 亚洲美女一区 | 观看av| 欧美999 | 狠狠亚洲 | 久久i| 日韩一区二区在线播放 | 国产精品区一区二区三区 | 日韩在线91 | 亚洲欧美国产精品一区二区 | 久久中文字幕av | 精品视频一区二区在线观看 | 国产在线网站 | www.天天操 | 黄色免费网站在线看 | 亚洲精品一区二区网址 | 亚州精品天堂中文字幕 | 羞羞视频免费在线观看 | 国产日韩免费视频 | 日韩午夜电影在线观看 | 久久69精品久久久久久国产越南 | 黄色片大全在线观看 | 久久久妇女国产精品影视 | 看片网站在线 | 婷婷久久网 | 久久久久久国产 | 美女视频黄色片 | 国产精品久久久久久久久久久久 | 中文字幕在线三区 | 91亚洲国产 | 欧美精品一区三区 | 欧洲精品在线观看 | 福利国产| 日韩免费一区二区 | 久久99精品久久久久久国产越南 | 亚洲精品视频免费观看 | 五月综合激情婷婷 | 久久久久久久亚洲精品 | 国产91在线视频 |