日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
自然框架之?dāng)?shù)據(jù)訪問

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

汪清ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

目標(biāo):

簡單、好用、易擴(kuò)展、穩(wěn)定、性能。

特點(diǎn):

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

不承擔(dān)的責(zé)任:

不對(duì)SQL語句進(jìn)行檢查。

不負(fù)責(zé)防止SQL注入。

不負(fù)責(zé)分頁。

圖示:

結(jié)構(gòu):

1、 兩個(gè)工廠

CommonFactory:生成Db系列的實(shí)例,比如DbConnection、DbCommand等。內(nèi)部使用。他們都是抽象基類不能直接new,需要相應(yīng)的子類的實(shí)例,比如new SqlConnection、new SqlCommand等。這個(gè)就需要根據(jù)當(dāng)前的需求(驅(qū)動(dòng)類型)來確定了,也就是這個(gè)工廠的職責(zé)。
DALFactory:調(diào)用者使用的工廠,通過這個(gè)工廠,根據(jù)數(shù)據(jù)驅(qū)動(dòng)類型,生成數(shù)據(jù)訪問的實(shí)例。

2、 主體部分

DataAccessLibrary:這個(gè)是數(shù)據(jù)訪問的核心部分,相當(dāng)于大樹的主干。定義了一個(gè)DbCommand Command,通過他來實(shí)現(xiàn)各種功能。

主體部分僅實(shí)現(xiàn)最基本的功能,定義內(nèi)部結(jié)構(gòu)、成員,實(shí)現(xiàn)輸入和輸出的功能。

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

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

另外可以通過子類來實(shí)現(xiàn)支持不同數(shù)據(jù)庫的差異的部分。

3、 配件部分

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

增加功能,并不影響其他的代碼,這個(gè)就是對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。

實(shí)例

 
 
 
 
  1. //發(fā)回復(fù)    
  2. Reply.bodyUBB = Request.Form["Editor"];    
  3. Reply.topicID = int.Parse(this.DataID);    
  4. #region 驗(yàn)證信息    
  5. if (Reply.bodyUBB.Length < 10)    
  6. {    
  7.     Functions.PageRegisterAlert(Page, "請(qǐng)?zhí)顚憙?nèi)容,或者內(nèi)容太短!至少也得寫10個(gè)字,對(duì)吧。");    
  8.     return;    
  9. }    
  10.  
  11. #endregion    
  12. #region 內(nèi)部字段    
  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", "
    ");    
  20. //其他略    
  21. #endregion    
  22. //開啟事務(wù)    
  23. Dal.ManagerTran.TranBegin();    
  24. ManagerParameter parm = Dal.ManagerParameter;    
  25. #region 設(shè)置參數(shù)    
  26. parm.ClearParameter();    
  27. parm.AddNewInParameter("TopicID", Reply.topicID);        //     
  28. parm.AddNewInParameter("回復(fù)內(nèi)容", bodyUBB);    
  29. parm.AddNewInParameter("內(nèi)容HTML", bodyHTML);    
  30. parm.AddNewInParameter("回復(fù)人ID", userID);    
  31. parm.AddNewInParameter("回復(fù)人IP", ip, 15);    
  32. parm.AddNewInParameter("回復(fù)時(shí)間", dateTime);    
  33. #endregion                  
  34. #region 保存回復(fù),表名:BBS_Reply    
  35. Dal.ModifyData.InsertData("BBS_Reply");    
  36. if (Dal.ErrorMessage.Length > 0)    
  37. {    
  38.     //出現(xiàn)異常    
  39.     Functions.PageRegisterAlert(Page, "保存您發(fā)的回復(fù)的時(shí)候出現(xiàn)意外情況!");    
  40.     return;    
  41. }    
  42. #endregion    
  43. string sql;    
  44. #region 更新回復(fù)人的回復(fù)數(shù)量,回復(fù)時(shí)間,以及各種積分。    
  45. sql = @"update BBS_Topic set 回復(fù)次數(shù) = 回復(fù)次數(shù) + 1 ,***回復(fù)時(shí)間 = GetDate(),    
  46. ***回復(fù)人ID = {0},   where TopicID ={1}";    
  47. Dal.ExecuteNonQuery(string.Format(sql, userID,topicID));    
  48. if (Dal.ErrorMessage.Length > 0)    
  49. {    
  50.     //出現(xiàn)異常    
  51.     Functions.PageRegisterAlert(Page, "更新回復(fù)數(shù)量的時(shí)候出現(xiàn)意外情況!");    
  52.     return;    
  53. }    
  54. #endregion    
  55. #region 更新回復(fù)人的參與討論的帖子    
  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 回復(fù)次數(shù) 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("***查看時(shí)間", dateTime);    
  68.     parm.AddNewInParameter("***查看回復(fù)數(shù)", intReCount);    
  69.     Dal.ModifyData.InsertData("BBS_UserInTopic");    
  70.     if (Dal.ErrorMessage.Length > 0)    
  71.     {    
  72.         //出現(xiàn)異常    
  73.         Functions.PageRegisterAlert(Page, "增加您參與討論的帖子的時(shí)候出現(xiàn)意外情況!");    
  74.         return;    
  75.     }    
  76.     #endregion    
  77. }    
  78. else   
  79.  
  80. {    
  81.     #region 參與過,修改記錄    
  82.     parm.ClearParameter();    
  83.     parm.AddNewInParameter("***查看時(shí)間", dateTime);    
  84.     parm.AddNewInParameter("***查看回復(fù)數(shù)", intReCount);    
  85.     Dal.ModifyData.UpdateData("BBS_UserInTopic", "UserInTopicID=" + userInTopicID);    
  86.     if (Dal.ErrorMessage.Length > 0)    
  87.     {    
  88.         //出現(xiàn)異常    
  89.         Functions.PageRegisterAlert(Page, "更新參與討論的帖子的時(shí)候出現(xiàn)意外情況!");    
  90.         return;    
  91.     }    
  92.     #endregion    
  93. }    
  94. #endregion    
  95. //提交事務(wù)    
  96. Dal.ManagerTran.TranCommit();    
  97. //正常    
  98. lblMsg.Text = "發(fā)表回復(fù)成功!感謝您的參與!1秒后重新加載帖子。";    
  99. Functions.PageRegisterJavascript(Page, "reload()");    

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

這個(gè)沒有按照三層的方式來寫,因?yàn)槲曳植怀鰜砟男┦菢I(yè)務(wù)邏輯,哪些是數(shù)據(jù)訪問,都寫到一起了,呵呵。但是這并不是說數(shù)據(jù)訪問只能寫成這個(gè)樣子。這個(gè)只是一個(gè)具體的、綜合性的例子。也可以把他分一分,找到業(yè)務(wù)邏輯的部分,提取出去,放在業(yè)務(wù)層;把數(shù)據(jù)訪問的部分也提出出去,放在數(shù)據(jù)層。

這里僅僅是一個(gè)數(shù)據(jù)訪問的調(diào)用的示例,并不是說要不要分層。

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

【編輯推薦】

  1. 曬曬我的通用數(shù)據(jù)訪問層
  2. 幾步走,教你創(chuàng)建簡單訪問數(shù)據(jù)庫方法
  3. 一句代碼實(shí)現(xiàn)批量數(shù)據(jù)綁定 下
  4. 一步一步設(shè)計(jì)你的數(shù)據(jù)庫1
  5. 不重復(fù)隨機(jī)數(shù)列生成算法

分享名稱:自然框架之?dāng)?shù)據(jù)訪問
文章路徑:http://www.5511xx.com/article/cdeecij.html