从数据库读取数据后,使用HashTable进行临时数据存储

时间:2010-02-05 14:33:44

标签: c# asp.net hashtable

我正在寻找意见和最佳编码实践。

我需要从数据库中获取信息,例如SELECT this, that FROM MyDB(返回2个字段)。

  1. 使用哈希表进行临时存储是否有误?

  2. 有没有更好的方法来完成同样的事情?

  3. 如果我返回超过2个字段,最好是升级到DataSet或其他什么?

  4. 我正在寻找简单的效率。

    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            GetData();
    
            foreach (DictionaryEntry de in ht)
            {
                DoSomething(Convert.ToInt32(de.Key), de.Value.ToString());
    
                DoMore(Convert.ToInt32(de.Key), de.Value.ToString());
    
                //etc...
            }
        }
    
        Hashtable ht = new Hashtable();
    
        private void GetData()
        {
            //connect to DB and use reader to fill hashtable ht with results..
        }
    
        private void DoSomething(int key, string value)
        {
            //do something with hashtable ht data
        }
    
        private void DoMore(int key, string value)
        {
            //do something else with hashtable ht data
        }
    }
    

6 个答案:

答案 0 :(得分:1)

您提议的是在程序中本地缓存整个表格。这有利有弊:

优点:

  • 许多小查询速度更快,只需要与数据库通信一次。
  • 您无需保持交易开放即可获得数据的不变副本。
  • 即使数据库脱机,您仍然可以访问数据。

缺点:

  • 您没有获得实时数据。
  • 第一次减慢,或者在应用程序启动时,因为它必须读取整个表格。
  • 在客户端上使用大量内存。
  • 更新本地副本不会自动更新数据库中的数据。

结论:

通常您不应该这样做,您只需要在需要时向数据库请求所需的值。但有时候它可能有意义。

答案 1 :(得分:1)

最好的办法是创建一个真正简单的数据对象。

private class MyData
{
    public int Id { get; set; }
    // Etc
}

接下来,使用强类型字典类。

Dictionary<int, MyData> myDbCache = new Dictionary<int, MyData>();

答案 2 :(得分:0)

您是否只考虑了DictionaryEntry一个键/值对或使用具有两个命名属性的域对象?

答案 3 :(得分:0)

这将取决于您在桌面上有多少条记录,以及哈希键的“随机”程度。您希望避免将密钥散列到同一个插槽以避免冲突,从而降低性能。

答案 4 :(得分:0)

如果您需要存储密钥/参数值,我建议您选择Dictionary<string,string>而不是哈希表。

答案 5 :(得分:0)

如果需要从多个页面访问您的数据(可能是这种情况),您可以将它们存储在静态字段中(实际上使用字典),因此需要为整个应用程序加载一次(每个用户一次) )。

这里封装在一个单身人士中:

public class Globals
{
  private Context _current;
  private Dictionary<int, string> _dbValues;

  public Dictionary<int, string> DbValues
  {
    get
    {
      if (_dbValues == Null)
      {
        // ... Load our data here
      }
      return _dbValues;
    }
    set
    {  
  }

  public Globals Current
  {
    get
    {
      if(_current == Null)
        _current = Context();
      return _current;
    }
  }    

  private Globals()
  {  }


}

// Can be used this way
var value = Globals.Current.DbValues[key1];