如何用SqlCeDataReader或SqlCeResultSet替换DataTable代码?

时间:2013-12-11 17:28:12

标签: c# sql-server-ce compact-framework windows-ce

CF Whisperer建议:

避免使用DataTables。它们是巨大的内存占用,在CE下你无法承受内存耗费。基本上它会将整个源表复制到RAM中.SqlCeDataReader和SqlCeResultSet是你的朋友。

here

......关于此代码:

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,因为它们的目的是(据说是)用于处理查询数据...... ???

1 个答案:

答案 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);
    }
}

我们做得更好因为:

  1. 我们没有重复记录
  2. 我们没有有效地迭代数据集两次
  3. 我们正在直接上桌