【问题标题】:How can I replace DataTable code with SqlCeDataReader or SqlCeResultSet?如何用 SqlCeDataReader 或 SqlCeResultSet 替换 DataTable 代码?
【发布时间】:2013-12-11 17:28:12
【问题描述】:

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

【问题讨论】:

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


    【解决方案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. 我们要直接上桌

    【讨论】:

    • 批量插入可能需要这样才能正常工作;批量插入来自 ErikEJ 的库。我认为,完成此操作的示例代码与我拥有的代码完全相同(除了列名和我的异常处理代码(消息框)的明显差异)。
    • 让我有点困惑的是,我认为我在脑海中混淆了你和 ErikEJ;我称他为“SQL Server CE 低语者”,而你是“CF 低语者”,但在我看来,他们是如此紧密地联系在一起,以至于在不认识你的情况下,你们两个很容易在我负担过重的可悲的颅骨中融为一体。
    • 我们很容易区分。他是个聪明人。
    • FWIW,我敢打赌,上面的代码实际上就是 Erik 在 BulkCopy 工具中所做的事情,只是没有一种简单的方法可以将对象集合放入他的东西中。添加到他的回调或基于任务的重载会很酷,并且可以更容易地将你需要的东西融入他所拥有的东西中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    相关资源
    最近更新 更多