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

C# 将大型数据表存储到数据库中的有效方法,c#,sql,ado.net,C#,Sql,Ado.net,我已经从一个文本文件中动态创建了一个datatable。现在我需要将值存储在数据库中。我发现了一些使用foreach和data row的示例,效果很好 foreach (DataRow row in dt.Rows) { // insert statement } 我的疑问是,数据表可能包含数千行,使用foreach循环是否有效,或者我是否应该使用诸如批量复制之类的其他技术(我不知道,所以请帮助我)。谢谢您如果使用SQL Server,您应该使用该类 我从您描述的循环转

我已经从一个文本文件中动态创建了一个datatable。现在我需要将值存储在数据库中。我发现了一些使用foreach和data row的示例,效果很好

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

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


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

如果您使用的是SQL Server,您应该使用该类


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

我不得不再次使用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);

            }
        }
    }
private void SaveAll(列出BO、IDbConnection conn、IDbTransaction trans)
{
使用(GenericListDataReader=new GenericListDataReader((IEnumerable)bos))
{
使用(SqlBulkCopy bcp=newsqlbulkcopy(
(SqlConnection)conn,SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers,
(SqlTransaction)trans)
{
bcp.BulkCopyTimeout=常量.BULK\u COPY\u超时;
bcp.DestinationTableName=“MainAttr”;
SqlBulkCopyColumnMapping mapID=
新的SqlBulkCopyColumnMapping(“Id”、“Id”);
bcp.ColumnMappings.Add(mapID);
SqlBulkCopyColumnMapping mainId=
新的SqlBulkCopyColumnMapping(“Mainid”、“Mainid”);
bcp.ColumnMappings.Add(mainId);
SQLBulkCopyColumnMappingMapCol=
新的SqlBulkCopyColumnMapping(“Attributecolumn”、“Attributecolumn”);
bcp.ColumnMappings.Add(mapCol);
SQLBulkCopyColumnMappingMapVal=
新的SqlBulkCopyColumnMapping(“Attributevalue”、“Attributevalue”);
bcp.ColumnMappings.Add(mapVal);
SQLBulkCopyColumnMappingMapLoadDate=
新的SqlBulkCopyColumnMapping(“Loaddate”、“Loaddate”);
bcp.ColumnMappings.Add(mapLoadDate);
SQLBulkCopyColumnMappingMapLoadBy=
新的SqlBulkCopyColumnMapping(“Loadby”、“Loadby”);
bcp.ColumnMappings.Add(mapLoadBy);
SQLBulkCopyColumnMappingMapDetail=
新的SqlBulkCopyColumnMapping(“detailid”、“detailid”);
bcp.ColumnMappings.Add(mapDetail);
bcp.NotifyAfter=Constants.BULK\u COPY\u PROGRESS\u REPORT;
bcp.SqlRowsCopied+=新的SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
bcp.WriteToServer(读卡器);
}
}
}
顺便说一句,如果你有兴趣了解更多关于你的选择,那么MSDN上有一个很好的数据加载指南;

编辑:关于GenericListDataReader的进一步示例,请访问以下网站;
我得再复印一份。我使用它通过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);

            }
        }
    }
private void SaveAll(列出BO、IDbConnection conn、IDbTransaction trans)
{
使用(GenericListDataReader=new GenericListDataReader((IEnumerable)bos))
{
使用(SqlBulkCopy bcp=newsqlbulkcopy(
(SqlConnection)conn,SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers,
(SqlTransaction)trans)
{
bcp.BulkCopyTimeout=常量.BULK\u COPY\u超时;
bcp.DestinationTableName=“MainAttr”;
SqlBulkCopyColumnMapping mapID=
新的SqlBulkCopyColumnMapping(“Id”、“Id”);
bcp.ColumnMappings.Add(mapID);
SqlBulkCopyColumnMapping mainId=
新的SqlBulkCopyColumnMapping(“Mainid”、“Mainid”);
bcp.ColumnMappings.Add(mainId);
SQLBulkCopyColumnMappingMapCol=
新的SqlBulkCopyColumnMapping(“Attributecolumn”、“Attributecolumn”);
bcp.ColumnMappings.Add(mapCol);
SQLBulkCopyColumnMappingMapVal=
新的SqlBulkCopyColumnMapping(“Attributevalue”、“Attributevalue”);
bcp.ColumnMappings.Add(mapVal);
SQLBulkCopyColumnMappingMapLoadDate=
新的SqlBulkCopyColumnMapping(“Loaddate”、“Loaddate”);
bcp.ColumnMappings.Add(mapLoadDate);
SQLBulkCopyColumnMappingMapLoadBy=
新的SqlBulkCopyColumnMapping(“Loadby”、“Loadby”);
bcp.ColumnMappings.Add(mapLoadBy);
SQLBulkCopyColumnMappingMapDetail=
新的SqlBulkCopyColumnMapping(“detailid”、“detailid”);
bcp.ColumnMappings.Add(mapDetail);
bcp.NotifyAfter=Constants.BULK\u COPY\u PROGRESS\u REPORT;
bcp.SqlRowsCopied+=新的SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
bcp.WriteToServer(读卡器);
}
}
}
顺便说一句,如果你有兴趣了解更多关于你的选择,那么MSDN上有一个很好的数据加载指南;

编辑:关于GenericListDataReader的进一步示例,请访问以下网站;

能否给我一个Sql bulk Copy的其他示例或教程在我的回答中,“SqlBulkCopy”一词是指向文档的链接,文档中有一个非常清晰的代码示例。日分