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

时间:2011-12-06 05:13:49

标签: c# sql ado.net

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

    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

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