将大型数据表存储到数据库中的有效方法

我已经从文本文件动态创建了一个数据表。现在我需要将值存储在database.i中找到一些使用foreach和data行的示例,它工作正常

foreach (DataRow row in dt.Rows) { // insert statement } 

我怀疑数据表可能包含数千行,使用foreach循环是否有效,或者我应该采用其他一些技术,如批量复制(我不知道它,所以请帮助我)。谢谢你

如果您使用的是SQL Server,则应使用SqlBulkCopy类。

我从你描述的循环转换为在我的一个应用程序中使用这个类的大量数据,并且性能提升令人难以置信。

我必须第二个SqlBulkCopy。 我正在使用它通过IDataReader接口将数百万或行加载到EAV数据库中,并在不到一分钟的时间内完成。 我如何使用它的一个例子如下;

  private void SaveAll(List bos, IDbConnection conn, IDbTransaction trans) { using (GenericListDataReader reader = new GenericListDataReader((IEnumerable)bos)) { using (SqlBulkCopy bcp = new SqlBulkCopy( (SqlConnection)conn, SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers, (SqlTransaction)trans)) { bcp.BulkCopyTimeout = Constants.BULK_COPY_TIMEOUT; bcp.DestinationTableName = "MainAttr"; SqlBulkCopyColumnMapping mapID = new SqlBulkCopyColumnMapping("Id", "Id"); bcp.ColumnMappings.Add(mapID); SqlBulkCopyColumnMapping mainId = new SqlBulkCopyColumnMapping("Mainid", "MainId"); bcp.ColumnMappings.Add(mainId); SqlBulkCopyColumnMapping mapCol = new SqlBulkCopyColumnMapping("Attributecolumn", "AttributeColumn"); bcp.ColumnMappings.Add(mapCol); SqlBulkCopyColumnMapping mapVal = new SqlBulkCopyColumnMapping("Attributevalue", "AttributeValue"); bcp.ColumnMappings.Add(mapVal); SqlBulkCopyColumnMapping mapLoadDate = new SqlBulkCopyColumnMapping("Loaddate", "LoadDate"); bcp.ColumnMappings.Add(mapLoadDate); SqlBulkCopyColumnMapping mapLoadBy = new SqlBulkCopyColumnMapping("Loadby", "LoadBy"); bcp.ColumnMappings.Add(mapLoadBy); SqlBulkCopyColumnMapping mapDetail = new SqlBulkCopyColumnMapping("detailid", "DetailId"); bcp.ColumnMappings.Add(mapDetail); bcp.NotifyAfter = Constants.BULK_COPY_PROGRESS_REPORT; bcp.SqlRowsCopied += new SqlRowsCopiedEventHandler(bcp_SqlRowsCopied); bcp.WriteToServer(reader); } } } 

顺便说一句,如果您有兴趣了解更多有关您的选项的信息,那么MSDN上有一个很好的数据加载指南; http://msdn.microsoft.com/en-us/library/dd425070(v=sql.100).aspx

编辑:关于GenericListDataReader的更多示例,请查看以下站点; http://www.csvreader.com/posts/generic_list_datareader.php