【问题标题】:How to best insert 350,000 rows with ADO.Net如何使用 ADO.Net 最好地插入 350,000 行
【发布时间】:2009-04-05 04:50:29
【问题描述】:

我有一个包含 350,000 行的 csv 文件,每行大约有 150 列。

使用 ADO.Net 将这些行插入 SQL Server 的最佳方法是什么?

我通常这样做的方式是手动创建 SQL 语句。我想知道是否有任何方法可以将其编码为简单地将整个数据表插入 SQL Server?或者像这样的捷径。

顺便说一下,我已经尝试过使用 SSIS 进行此操作,但是有一些数据清理问题我可以使用 C# 处理,但使用 SSIS 却不那么容易。数据以 XML 开头,但为了简单起见,我将其更改为 CSV。

【问题讨论】:

    标签: c# .net ado.net csv etl


    【解决方案1】:

    创建一个实现 IDataReader 的类“CsvDataReader”。只需实现 Read()、GetValue(int i)、Dispose() 和构造函数:如果需要,您可以让其余部分抛出 NotImplementedException,因为 SqlBulkCopy 不会调用它们。使用 read 处理每一行的读取,使用 GetValue 读取该行中的第 i 个值。

    然后使用所需的适当列映射将其传递给 SqlBulkCopy。

    使用该方法,我获得了大约 30000 条记录/每秒的插入速度。

    如果您可以控制源文件格式,请将其设为制表符分隔,因为它比 CSV 更容易解析。

    编辑:http://www.codeproject.com/KB/database/CsvReader.aspx - tx Mark Gravell。

    【讨论】:

    【解决方案2】:

    SqlBulkCopy(如果可用)。这是使用SqlBulkCopy in ADO.NET 2.0 with C#的非常有用的解释

    我认为您可以将 XML 直接加载到 DataSet 中,然后将 SqlBulkCopy 映射到数据库和 DataSet。

    【讨论】:

      【解决方案3】:

      您应该恢复为 XML 而不是 csv,然后使用 openxml 将该 xml 文件加载到临时表中,清理临时表中的数据,然后最后处理这些数据。

      我一直在使用这种方法来导入大量数据,其中我的 XML 文件大小恰好 > 500 mb,而 openxml 就像一个魅力一样工作。

      您会惊讶于与手动 ado.net 语句相比,它的运行速度要快得多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-27
        • 1970-01-01
        相关资源
        最近更新 更多