我试过这种方式从数据表中读取数据是否还有其他更好的方法将数据存储在列表中(以减少内存使用量)。
代码:
foreach (System.Data.DataRow row in table.Rows)
{
Myclassdef data = new Myclassdef();
data.Data = new Dictionary<string, object>();
foreach (DataColumn columninfo in table.Columns)
{
object value = row[columninfo.ColumnName];
Myclassdef.Data.Add(columninfo.ColumnName, value);
}
}
答案 0 :(得分:5)
您确定您的记忆问题是由DataTable
造成的吗?您将所有映射到自定义类,每行都有一个字典。所以你需要的内存比单独使用DataTable
多两倍。
但是,如果您正在从数据库中读取值,并且您要将所有值全部加载到DataTable
中,只是为了能够循环所有以使用字典创建自定义类,那么就可以使用更好的方法内存消耗:
使用DataReader
从数据库中读取这些值。无需在内存中存储任何内容即可流式传输数据
var list = new List<Myclassdef>();
using (var con = new SqlConnection(Settings.Default.ConnectionString))
{
using (var cmd = new SqlCommand("SELECT ... WHERE Col1=@param1", con))
{
cmd.Parameters.AddWithValue("@param1", "value1");
// ...
con.Open();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Myclassdef data = new Myclassdef();
data.Data = new Dictionary<string, object>();
for (int i = 0; i < reader.FieldCount; i++)
{
data.Data.Add(reader.GetName(i), reader[i]);
}
list.Add(data);
}
}
}
}
答案 1 :(得分:3)
您在问是否有更好的方法,或者您是否询问是否有更高效的内存存储选项?
我非常怀疑任何其他内存存储选项会给你一个明显的区别。列表和词典可能不是最有效的存储选项,但它们也不是生猪。
如果你想知道是否有更好的方法取决于你想要做什么。如果要向用户显示该数据,通常所做的是计算表的可见大小(以使滚动条按预期运行)并且仅缓存查看区域之外的一些前一个和下一个记录。当用户四处查看表时,数据会根据需要延迟加载。