首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Bulkcopy批量运行datatable

SQL Bulkcopy批量运行datatable
EN

Stack Overflow用户
提问于 2014-04-11 15:40:13
回答 1查看 1.6K关注 0票数 1

目前我有大约一千万张唱片的平版档案。

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

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

( 1)也就是说,不要将1,000万条记录加载到datatable中,然后加载到数据库中。是否最好将100万的“块”加载到datatable中,并在循环中将其处理到数据库中,直到所有数据都被处理为止?或者,如果有人对如何改进这个过程有任何建议的话,我会很感激的!

代码语言:javascript
复制
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();
            }
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-11 16:03:02

你绝对是在正确的轨道上。

SQL大容量复制应该能够在大约30秒内处理超过一百万条记录。我在dbsourcetools.codeplex.com和SQLBulkCopy中使用了SQLBulkCopy

代码语言:javascript
复制
            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 ");
            }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23016987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档