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

时间:2011-07-28 23:27:41

标签: sql-server datatable sqlbulkcopy

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

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

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

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

我该如何做到这一点?

1 个答案:

答案 0 :(得分:2)

不建议将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启动。