Sql server 在I';我在填

Sql server 在I';我在填,sql-server,datatable,sqlbulkcopy,Sql Server,Datatable,Sqlbulkcopy,我通过添加类型化列定义了DataTable。我预计DataTable的行数在100万到300万行之间 我使用微软的TextFieldParser(因为它支持多种固定宽度格式,有点像是通过Peek方法),来填充数据表的行 我想进行某种操作,将数据表中的行复制到镜像SQL表中 如果我填充整个DataTable,然后使用SqlAdapter和SqlCommandBuilder更新前面提到的SQL表,那么我的内存就用完了 如何实现这一点?不建议对1m行使用DataTable,您只需为INSERT创建新的

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

我使用微软的TextFieldParser(因为它支持多种固定宽度格式,有点像是通过Peek方法),来填充数据表的行

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

如果我填充整个DataTable,然后使用SqlAdapter和SqlCommandBuilder更新前面提到的SQL表,那么我的内存就用完了


如何实现这一点?

不建议对1m行使用DataTable,您只需为INSERT创建新的SqlComand,并将所有表字段设置为参数,然后在循环中运行此命令

但是如果你已经用DataTable编写了很多代码,你可以把它看作一个缓冲区,并有如下的解决办法:

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

2) 当您得到10K行时,您就执行DataTable.Update()

(您可以将此参数称为缓冲区大小,并将其置于配置中以避免硬编码)

3) 然后通过调用

DataTable.Clear(); 
DataTable.AcceptChanges();
4) 继续从文件中读取数据,循环重复


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

1) 批量插入-

2) bcp实用程序-

3) MS SQL集成服务-


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

为什么不建议这样做?将其与SqlBulkCopy配对如何?您可以将其与BulkCopy配对,但内存不足不是因为使用SqlCommand,而是因为内存中的DataTable的大小非常大。仅大容量复制可以优化插入操作的速度。在上面提出的解决方案中,仅在2)中使用SqlBulkCopy.WriteToServer