CF Whisperer建议:
“避免使用DataTables。它们是巨大的内存占用,在CE下你无法承受内存耗费。基本上它会将整个源表复制到RAM中.SqlCeDataReader和SqlCeResultSet是你的朋友。“
......关于此代码:
var dt = new DataTable();
dt.Columns.Add(new DataColumn("Id", typeof(Int32)));
dt.Columns.Add(new DataColumn("DeptNumber", typeof(Int32)));
dt.Columns.Add(new DataColumn("DeptName", typeof(string)));
foreach (HHSUtils.Department dept in depts)
{
try
{
dt.Rows.Add(dept.Id, dept.DeptNumber, dept.DeptName);
countAdded++;
}
catch (Exception ex)
{
MessageBox.Show(string.Format("deptId == {0}, deptNumber == {1},
deptName == {2} ({3})", dept.Id, dept.DeptNumber, dept.DeptName, ex.Message));
}
}
// Now move it all into the table
using (var bc = new SqlCeBulkCopy(dataSource))
{
bc.DestinationTableName = "Departments";
bc.WriteToServer(dt);
}
我不明白我将如何用SqlCeDataReader或SqlCeResultSet替换DataTable。我在DataTable上面的代码是DDL,似乎并不等同于(在我看来)SqlCeDataReader或SqlCeResultSet,因为它们的目的是(据说是)用于处理查询数据...... ???
答案 0 :(得分:1)
我不完全理解第一个循环。如果您有一组Department项,那么为什么要将它们全部复制到DataTable中呢?你实际上只是将每个副本复制到内存中,如果有很多内存,那将是一个问题。这也浪费了处理时间。
我更倾向于做这样的事情(未经测试,未编译的伪代码):
var cmd = new SqlCeCommand(connection);
cmd.CommandText = "MyTableName";
cmd.CommandType = CommandType.TableDirect
using(var rs = cmd.ExecuteResultSet(
ResultSetOptions.Updatable | ResultSetOptions.Scrollable))
{
foreach(var dept in depts)
{
var record = rs.CreateRecord();
record.SetInt(0, dept.ID);
// do other fields
rs.Insert(record);
}
}
我们做得更好因为: