2009-11-28 69 views
1

我正在使用SqlDataReader从SQL Server读取数据。不过有时候我想把我的数据缓存在内存中作为只读轻量级无连接的对象。我在BCL找不到任何选择。我是否需要编写我自己的这种容器的实现,还是可用?轻量级只读替代DataTable用于存储来自SqlDataReader的数据?

什么选择我必须在轻形式从数据库中存储的数据?对我来说DataTable根本不是候选人。

编辑:

当我知道我选择什么样的数据,我可以很容易地使用LINQ到我的读者转化为List<T>什么的。但是,我想能够缓存我不知道其结构的数据。

回答

3
List<object[]> 

似乎即将轻量级,你可以得到。

如果你想要更多的功能,它提供了(如列名,数据绑定的支持,排序,过滤),那么你就可以取得/封装并添加功能。

您的要求相当模糊。轻量级意味着什么? DataTable不适用于什么? DataTable提供哪些功能?

+0

@Joe通过轻量级,我不仅意味着内存使用,而且速度。初始测试显示DataTable比LINQ Execute 方法更慢。关于名单的解决方案 - 你是对的,我确定可以通过添加功能来做到这一点。如果有的话,我只是想找到BCL中的任何现有实现。 – 2009-11-28 09:39:13

+0

当你谈论DataTable类和Execute 方法之间的速度差异时,我很不清楚你在比较什么。 – Joe 2009-11-28 10:18:30

+0

@Joe DataTable.Load方法从SqlDbReader与LINQ读取翻译从SqlDbReader读取并将其转换为类型化的枚举的方法。数据表越来越大。 – 2009-11-28 10:49:58

0

最好的选择是创建一个表示数据列的类型,然后为每一行构造该类的一个实例,使用读者的值填充其属性,并将实例存储在一个List<YourClass>结构中。

喜欢的东西:

using(SqlDataReader rdr = sqlCommand.ExecuteReader()) 
{ 
    List<YourClass> resultList = new List<YourClass>(); 

    while(rdr.Read()) 
    { 
     YourClass work = new YourClass(); 

     // set the properties   
     work.Property1 = rdr["Column1"].Value; 
     ..... 
     work.PropertyN = rdr["ColumnN"].Value; 

     resultList.Add(work); 
    } 
} 

这基本上在它的核心是什么任何ORM(对象关系映射器)不 - 从数据库中读取用最快的方式(DataReader的)的数据,并从构建.NET对象它。

马克

+0

当我确切知道什么数据我很容易返回。我正在寻找一个通用的容器,其功能类似于DataTable,但不是DataTable :) – 2009-11-28 07:47:24

1

创建您自己的数据结构。

的BCL不应该将所有的东西给所有的人。它由积木组成。 BCL包含您需要创建自己的数据结构的构建块。

如果BCL包含的每一个问题的解决方案将是一个臃肿混乱。并不是每一个功能都应该是“现货供应”的,否则作为程序员将没有任何价值可供添加。

你似乎有很明确的要求,即从“正常”的使用模式不同。在DataSet和ORM之间,绝大多数项目相处得很好,没有你需求调用的功能。

1

您可以使用List<Dictionary<String, Object>>,其中字典关键是列名和值单元格的值。

如果有很多行,可以将列名分隔为List<String>和值List<List<Object>>(或Array)。

0

使用此:

List<string> Variable1 = new List<string>(); 
//Do something with the generic 

string[] MyArray = Variable1.ToArray(); 

这是必须的轻量化和高效率的obj保存到内存中。