2012-07-31 51 views
0

有没有办法缓存MySQL查询的结果,特别是数据读取器?Cache mysql results c#

我有一些世俗的查询,真正只需要执行一次应用程序加载时,然后每个窗体可以使用缓存值,而不是查询远程服务器。

目前我的方法是使用了MySqlDataReader来检索数据,并将其存储在另一个了MySqlDataReader所以可以在代码在稍后时间检索它(如下所示)

if (parentfrm.prioritylist != null) 
     { 
      if (parentfrm.prioritylist.HasRows) 
      { 
       using (var rows = parentfrm.prioritylist) 
       { 
        while (rows.Read()) 
        { 
         cboxitem cbi = new cboxitem(int.Parse(rows["priorityid"].ToString()), rows["label"].ToString()); 
         cb.Items.Add(cbi); 
        } 
       } 
      } 
      else 
      { 
       query = @"SELECT priorityid, label FROM prioritylist WHERE active = 'Y' ORDER BY theorder ASC"; 
       parentfrm.prioritylist = db.localfetchrows(query); 
       if (cb != null) 
       { 
        using (var rows = db.localfetchrows(query)) 
        { 
         while (rows.Read()) 
         { 
          cboxitem cbi = new cboxitem(int.Parse(rows["priorityid"].ToString()), rows["label"].ToString()); 
          cb.Items.Add(cbi); 
         } 
        } 
       } 
      } 
     } 
     else 
     { 
      query = @"SELECT priorityid, label FROM prioritylist WHERE active = 'Y' ORDER BY theorder ASC"; 
      parentfrm.prioritylist = db.localfetchrows(query); 
      if (cb != null) 
      { 
       using (var rows = db.localfetchrows(query)) 
       { 
        while (rows.Read()) 
        { 
         cboxitem cbi = new cboxitem(int.Parse(rows["priorityid"].ToString()), rows["label"].ToString()); 
         cb.Items.Add(cbi); 
        } 
       } 
      } 
     } 
+0

winform? asp.net? MVC?跆拳道? WPF? WCF? – 2012-07-31 13:30:00

+0

我的歉意我认为我已经标记了它,winform – Neo 2012-07-31 13:31:35

回答

1
public class Priority{ 
    public int PriorityId {get;set;} 
    public string Label {get;set;} 
} 

public class CachedItems { 
    private static List<Priority> _priorityList=new List<Priority>(); 

    public static List<Priority> GetPriorityList() { 
     if (_priorityList==null){ 
      // Load DB Items to the _priorityList, 
      // if the app is multithreaded, you might wanna add some locks here 
     } 
    } 
} 

然后在任何地方,只需使用CachedItems.GetPriorityList()即可访问缓存列表。

+0

因此,您的解决方案是将数据读取器转换为对象,然后将对象存储在列表中。是否有一种更简单的方法,将数据读取器中的数据转换为对象而无需定义代码,因为某些数据将有20列以上:( – Neo 2012-07-31 13:36:55

+1

如果您希望可以将它们保存在“Dictionary 而不是'List ',但是你需要随时施放这些值,从长远来看,我建议你按照Steve B的方式去做。 – 2012-07-31 13:41:03

1

简短的回答:填充对象,并再次使用

较长的答案:设计应用程序使用某种脱钩。最简单的方法是使用双DataSet/DataAdapter类+一些数据绑定。

不仅您的代码会更简单地阅读(和写),但您将拥有更多的灵活性(如仅根据需要触发请求)。

传统的方法是创建:

  • 数据抽象层(DAL)来封装数据库操作返回数据集(或自定义类),保存设置(DataSet有一个内置的更改跟踪功能)
  • 封装逻辑的业务逻辑层(BLL)。 Bll可以与包含应用程序本身的UI层一起使用DAL
  • 。 Ui只应该叫BLL的方法。

开始通过阅读这篇文章:http://www.codeproject.com/Articles/36847/Three-Layer-Architecture-in-C-NET

0

你可能会考虑一个小应用工具包类,PriorityCheckboxes,并使其成为单身。然后,当您需要这些复选框值时,请首先引用PriorityCheckboxes上的GetInstance()方法,然后加载它。如果你有这种竞争条件,加载逻辑可以进入静态初始化器。

public class PriorityCheckboxes { 
    private static CheckBox _CBItems = null; 

    private static PriorityCheckboxes _instance - null; 

    public CheckBox CheckBoxes { 
     get() { return _CBItems; } 
    } 

    private PriorytyCheckboxes() { 
     this.LoadCBItems(); 
     _instance = new PriorityCheckboxes(); 
    } 

    public static PriorityCheckboxes GetInstance() { 
     if(_instance == null) _instance = new PriorityCheckboxes(); 
     return _instance; 
    } 
    private void LoadCBItems() { } 
} 
1

一个快速的方法是使用动态类型/匿名类(.NET 4),这是看齐,与你已经做什么(建筑上Mennans代码位)

public class CachedItems 
    { 
     private static List<dynamic> _priorityList = new List<dynamic>(); 

     public static List<dynamic> GetPriorityList() 
     { 
      if (_priorityList == null) 
      { 
       // Load DB Items to the _priorityList, 
       // if the app is multithreaded, you might wanna add some locks here 

       query = @"SELECT priorityid, label FROM prioritylist WHERE active = 'Y' ORDER BY theorder ASC"; 
       parentfrm.prioritylist = db.localfetchrows(query); 
       if (cb != null) 
       { 
        using (var rows = db.localfetchrows(query)) 
        { 
         while (rows.Read()) 
         { 
          _priorityList.Add(new { 
               PriorityId = int.Parse(rows["priorityid"].ToString()), 
               Label = rows["label"].ToString() 
               }); 
         } 
        } 
       } 

      } 

      return _priorityList; 
     } 
    } 

使用缓存值:

 foreach (var item in CachedItems.GetPriorityList()) 
     { 
      if (item.Priority == 1) 
      { 

      } 
     } 

什么你不明白的是即item.Priority类型安全migth使你运行时错误,如果优先级不包含的值或者这是不是一个int值,你将不得不掩盖这一点当加载缓存时,但基本上你现在正在使用数据读取器。