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

本文关键字:有效 方法 数据库 大型 数据表 存储 | 更新日期: 2023-09-27 18:16:48

我已经从文本文件动态创建了一个数据表。现在我需要将值存储在数据库中。我发现了一些使用foreach和数据行的例子,它工作得很好

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

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

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

如果你正在使用SQL Server,你应该使用SqlBulkCopy类。

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

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

    private void SaveAll(List<MyBO> bos, IDbConnection conn, IDbTransaction trans)
    {
        using (GenericListDataReader<MyBO> reader = new GenericListDataReader<MyBO>((IEnumerable<MyBO>)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

Edit:关于GenericListDataReader的进一步示例,请查看以下站点;http://www.csvreader.com/posts/generic_list_datareader.php