熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

一次數據訪問層的改進之路

2013-11-13 09:57:52  來源: .NET編程 

  隨著平民網絡時 代的到來微型數據庫必然發揮它獨到的作用Access就是一個不錯的選擇!

  今個我也用了下Access數據庫麻雀雖小名堂多啊!

  查詢永遠是神一樣的問題不停的探索無止境的接近極限很明顯如何用最少的代碼寫出最好的查詢?

  對問題是:

  如何用最少的代碼寫出最好的查詢?

  我的最好的定義是:代碼最美效率最合適(能快就快不能快夠用就行)開發速度最快

  這裡以用戶登錄為例子先生成相應的實體類(UserLoginInfocs):

  UserLoginInfocs

  下面我們一起來玩數據查詢的升級游戲

  具體問題查詢出userPass為這種下三濫的密碼的用戶

  最原始查詢

  GetList(string userPass)

  //中間掉了一句話

  foreach(OleDbParameter para in paras){

  cmdParametersAdd(para);

  }

  總結在這個階段最惡心的就是

  一大堆ConnectionCommand的操作

  讀取reader賦值給list的UserLoginInfo的過程每個字段索引的對起來心煩!

  對ConnectionCommand的封裝

  就是SqlHelper那樣的自己隨便搞了個

  ACECommonHelper

  大概的思想就是這樣調用代碼我想大家也能想象的到代碼參考下一個步驟可重用性大了

  改進reader填充到list自動讀取

  根據反射讀取數據庫中的字段自動給UserLoginInfo相應的字段賦值

  說明由於是代碼生成數據庫的字段基本上和生成類的屬性一致

  從網上下了個類

  ACEReaderToModecs

  改進後的查詢方法:

  GetList(string userPass)

  public List<UserLoginInfo> GetList(string userPass)

  {

  List<UserLoginInfo> list = null;

  List<OleDbParameter> paras = new List<OleDbParameter>();

  OleDbParameter para = new OleDbParameter(@userPass OleDbTypeLongVarWChar);

  paraValue = userPass;

  parasAdd(para);

  using (OleDbConnection connection = new OleDbConnection(connectionString))

  {

  OleDbDataReader reader = AccessHelperACECommonHelperExcuteReader(

  select * from User_login where userPass=@userPass

  conn

  parasToArray());

  list = AccessHelperACEReaderToModelReaderToList<UserLoginInfo>(reader);

  readerClose();

  connClose();

  }

  return list;

  }

  總結這時候的讀取數據部分的代碼已經相對之前干淨很多了但是細想一下真要你寫這樣的代碼你覺得哪

  個地方你還是覺得是在不停的重復?對就是那個參數的位置

  特別是參數一多到處都聞得到是復制的味道看著也不大清晰擋住了很多核心的代碼

  傳參每次都寫這樣的重復的代碼真的很容易厭倦的大家都是喜新厭舊的人再改進一下

  改進Parameter的寫法

  我們能不能在一句話中就能把參數所有的性質添加進去呢?我看行!

  ACEParameterHelpercs

  調用的時候查詢方法這樣寫了:

  GetList(string userPass)

  現在是不是清爽多了不管再如何寫主要部分基本上都是不同的

  總結我想這個函數設計數據的方面還是太多了存在很多connreader我們完全可以在此基礎上封裝一個通

  用的方法只要變化的部分參數sql語句和conn連接

  業務封裝把底層都包起來對外返回數據列表即可

  GetList(string strSql OleDbConnection conn OleDbParameter[] paras)

  此時這就是一個不錯的方法了給他他想要的得你你想得的

  調用的時候簡明簡單

  業務邏輯層均是類似調用

  參數越多這個代碼就看著越爽

  至此一個返回數據列表的數據訪問層的改進就暫告一段落

  頗多限制需要不斷的完善以及繼續深入的改進

  你現在不用再對每個不同查詢或者類似的查詢寫一大堆差不多的代碼了

  而為了這個目標我們所做的事情是

  不停的犧牲性能不停的提高效率!

  唯一要問的是你的項目能用不?

  如果滿足你的要求為什麼不用呢?

  發現可能代碼顯示有問題完整的代碼留下郵箱我郵箱發送

  好久沒有寫博客了想念啊一定要發在首頁各位不要砸我~!

  ps發現修改後代碼顯示不了最後兩段代碼我補上

  代碼

  /// <summary>

  /// 根據sql語句和傳入參數獲取結果列表

  /// </summary>

  /// <typeparam name=T></typeparam>

  /// <param name=strSql></param>

  /// <param name=conn></param>

  /// <param name=paras></param>

  /// <returns></returns>

  public static List<T> GetList<T>(string strSql OleDbConnection conn OleDbParameter[] paras)

  {

  List<T> list = null;

  OleDbDataReader reader = ACECommonHelperExcuteReader(strSql conn paras);

  list = ACEReaderToModelReaderToList<T>(reader);

  readerClose();

  readerDispose();

  connClose();

  return list;

  }

  代碼

  OleDbParameter[] paras = new ACEParameterHelper()AddParameter<string>(memoCode memoType)

  GetParameters();

  List<DataDictItemInfo> list = null;

  list = ACEAdvanceHelperGetList<DataDictItemInfo>(select * from Fk_data_dict_item t where mo=@memoType and tparent_id= conn paras);

  return list;


From:http://tw.wingwit.com/Article/program/net/201311/12134.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.