1

我正在使用SqlDataReader从 SQL Server 读取数据。但是有时我想将我的数据作为只读轻量级无连接对象缓存在内存中。我在 BCL 中找不到任何适合我的选项。我是否需要编写自己的此类容器的实现,或者是否可用?

以轻量级形式存储数据库中的数据有哪些替代方法?对我来说, DataTable根本不是候选人。

编辑:

当我知道我在选择什么数据时,我可以很容易地使用 LINQ 将我的阅读器转换成List<T>什么东西。但相反,我希望能够缓存我不知道其结构的数据。

4

5 回答 5

3
List<object[]>

看起来尽可能轻巧。

如果您想要它提供的更多功能(例如列名、数据绑定支持、排序、过滤),那么您可以派生/封装并添加该功能。

你的要求比较模糊。轻量级是什么意思?DataTable 有什么不合适的?您需要 DataTable 提供的哪些功能?

于 2009-11-28T09:07:33.357 回答
1

最好的选择是拥有一个代表数据列的类型,然后为每一行构造该类的实例,用读取器的值填充其属性,并将实例存储在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 对象。

马克

于 2009-11-28T07:41:05.840 回答
1

创建自己的数据结构。

BCL 不应该是所有人的一切。它由构建块组成。BCL 包含创建自己的数据结构所需的构建块。

如果 BCL 包含所有问题的解决方案,那将是一团糟。并非每一项功能都应该“现成”可用,否则作为程序员的您将没有任何价值可以添加。

您似乎有与“正常”使用模式不同的相当明确的要求。在 DataSet 和 ORM 之间,大多数项目在没有您要求的功能的情况下都能正常运行。

于 2009-11-28T10:04:06.983 回答
1

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

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

于 2009-11-28T10:10:49.193 回答
0

用这个:

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

string[] MyArray = Variable1.ToArray();

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

于 2009-11-28T10:24:30.273 回答