【发布时间】: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();
}
}
【问题讨论】:
标签: c# sql sqlbulkcopy