【问题标题】:SQL Bulkcopy run datatable in batchesSQL Bulkcopy 批量运行数据表
【发布时间】:2014-04-12 00:03:02
【问题描述】:

目前我有一个大约 1000 万条记录的平面文件。

我首先读取文件并将列映射到数据表中。然后使用 SQLBulkCopy 从 Datatable 将其移动到数据库中。这是一个缓慢的过程,而且超时很多。

我想知道这个过程是否可以做得更好。

1) 即而不是将我的 1000 万条记录加载到数据表中,然后再加载到数据库中。将 100 万个“块”加载到数据表中并循环处理它们到数据库中直到全部处理完会更好吗?或者,如果有人对如何改进此过程有任何建议,将不胜感激!

foreach (var line in File.ReadLines(fileLocation + @"\" + filename))
        {
            var dataColumns = line.Split('\t');
            var dr = dt.NewRow();

            for (var i = 0; i < dataColumns.Length; i++)
            {
                dr[i] = dataColumns[i].Trim().Length == 0 ? null : dataColumns[i];
            }

            dt.Rows.Add(dr);
        }

        using (var destinationConnection = new SqlConnection(Settings.Default.ConnectionString))
        {
            var tableName = filename.Substring(0, filename.IndexOf('.'));
            destinationConnection.Open();

            try
            {
                using (var createAndDropTableCommand = new SqlCommand("sp_DropAndCreateTable", destinationConnection))
                {
                    createAndDropTableCommand.CommandType = CommandType.StoredProcedure;
                    createAndDropTableCommand.Parameters.Add("@TableToCreate", SqlDbType.VarChar).Value = tableName;
                    createAndDropTableCommand.ExecuteNonQuery();
                }

                using (var bulkCopy = new SqlBulkCopy(destinationConnection))
                {
                    bulkCopy.DestinationTableName = "dbo." + tableName;
                    bulkCopy.BatchSize = 10000;
                    bulkCopy.ColumnMappings.Clear();
                    foreach (DataColumn col in dt.Columns)
                    {
                        bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(col.ColumnName, col.ColumnName));
                    }

                    bulkCopy.WriteToServer(dt);
                }
            }
            finally
            {
                destinationConnection.Close();
            }
        }

【问题讨论】:

  • 您能告诉我们更多关于您收到的实际错误的信息吗?还有为什么要改进代码?您需要让它变得更好还是仅仅从学习的角度来看?
  • 您是否将其与使用bcp 之类的工具进行了比较?
  • 您可以通过创建一个新的Type直接将DataTable传递给sql server。检查this

标签: c# sql sqlbulkcopy


【解决方案1】:

你肯定走在正确的轨道上。
SQL 批量复制应该能够在大约 30 秒内处理超过一百万条记录。我在dbsourcetools.codeplex.com 中使用了带有 SQLBulkCopy 的 DataSet

            System.Data.DataSet oDataSet = new System.Data.DataSet();
            oDataSet.ReadXmlSchema(strSchemaXml);
            oDataSet.ReadXml(strTableXml);

            if (oDataSet.Tables.Count > 0)
            {
                using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(oTargetDatabase.ConnectionString))
                {
                    conn.Open();
                    System.Data.SqlClient.SqlTransaction oTran = conn.BeginTransaction();

                    System.Data.SqlClient.SqlBulkCopy oSqlBulkCopy
                        = new System.Data.SqlClient.SqlBulkCopy(conn, System.Data.SqlClient.SqlBulkCopyOptions.KeepIdentity, oTran);
                    oSqlBulkCopy.BulkCopyTimeout = 600; 
                    oSqlBulkCopy.BatchSize = 1000;
                    oSqlBulkCopy.DestinationTableName = strFullyQualifiedTableName; 
                    oSqlBulkCopy.NotifyAfter = 10000;
                    oSqlBulkCopy.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(oSqlBulkCopy_SqlRowsCopied);
                    foreach (System.Data.DataColumn ocol in oDataSet.Tables[0].Columns)
                    {
                        oSqlBulkCopy.ColumnMappings.Add(ocol.ColumnName, ocol.ColumnName);
                    }

                    oSqlBulkCopy.WriteToServer(oDataSet.Tables[0]);
                    oTran.Commit();
                    conn.Close();
                }
                System.Console.WriteLine("Wrote : " + oDataSet.Tables[0].Rows.Count.ToString() + " records ");
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    相关资源
    最近更新 更多