在填写时,如何将DataTable内容复制到SQL表中

datatable sqlbulkcopy sql-server

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

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

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

如果我填充整个DataTable,然后使用SqlAdapter和SqlCommandBuilder来更新这里提到的SQL表,我的内存不足。

我怎么能做到这一点?

一般承认的答案

建议不要将DataTable用于1M行,只需为INSERT创建新的SqlComand并使所有表字段成为参数并在循环中运行此命令。

但是,如果您已经使用DataTable编写了大量代码,则可以将其视为缓冲区,并具有以下解决方法:

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

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

(您可以将此参数称为buffer_size,并将其置于配置中以避免硬编码)

3)然后通过调用清理DataTable中的所有数据

DataTable.Clear(); 
DataTable.AcceptChanges();

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


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

1)BULK INSERT - http://msdn.microsoft.com/en-us/library/ms188365.aspx

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

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

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




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因