【问题标题】:How can I copy DataTable contents to an SQL table while I'm filling it如何在填充时将 DataTable 内容复制到 SQL 表中
【发布时间】:2011-08-16 14:58:24
【问题描述】:

我通过添加类型列定义了一个 DataTable。我预计 DataTable 的行数在 100 万到 300 万行之间。

我正在使用 Microsoft 的 TextFieldParser(因为它支持多种固定宽度格式,还不错,通过 Peek 方法)来填充 DataTable 的行。

我想要进行某种操作,将数据表中的行复制到镜像 SQL 表中。

如果我填充整个 DataTable,然后使用 SqlAdapter 和 SqlCommandBuilder 更新 SQL 表,如 here 所述,我的内存不足。

我怎样才能做到这一点?

【问题讨论】:

    标签: sql-server datatable sqlbulkcopy


    【解决方案1】:

    不建议对1M的行使用DataTable,你可以简单地为INSERT创建新的SqlComand并将所有表字段都作为参数并在循环中运行该命令。

    但是如果你已经用DataTable写了很多代码,你可以把它当成一个缓冲区,有以下变通方法:

    1) 就您读取的数据行而言,检查到目前为止已经读取了多少行

    2) 一旦获得 10K 行,就执行 DataTable.Update();

    (您可以将此参数称为 buffer_size 并放在配置中的某个位置以避免硬编码)

    3) 然后通过调用

    清理 DataTable 中的所有数据
    DataTable.Clear(); 
    DataTable.AcceptChanges();
    

    4) 你继续从文件中读取数据,循环重复


    此外,如果不了解文件结构和应用程序的用途,很难提出一般性建议,我只回答了在使用非常大的数据集时如何避免“内存不足”的问题。但我也建议考虑所有可能的选项,以避免使用 .NET 数据表作为数据的中间存储,并使用 SQL 服务器提供的所有可能方式直接处理文件,例如

    1) 批量插入 - http://msdn.microsoft.com/en-us/library/ms188365.aspx

    2) bcp 实用程序 - http://msdn.microsoft.com/en-us/library/ms162802.aspx

    3) MS SQL Intergartion 服务 - http://msdn.microsoft.com/en-us/library/ms141026.aspx

    可以从 .NET 启动使用任何这些命令和工具的批量插入操作。

    【讨论】:

    • 为什么不推荐?将它与 SqlBulkCopy 配对怎么样?
    • 你确实可以将它与批量复制配对,但是你的内存不足不是因为使用SqlCommand而是因为内存中DataTable的大小非常巨大。仅批量复制可以优化 INSERT 操作的速度。在上面提出的解决方案中 2) 使用 SqlBulkCopy.WriteToServer
    猜你喜欢
    • 2012-08-13
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多