我正在从巨大的csv文件(5,000,000行和数百列)中读取数据,并使用 SqlBulkCopy 将数据写入sql表。我试图加快性能并在SqlBulkCopy类中找到 WriteToServerAsync 方法。它比 WriteToServer 方法快得多,但在sql表中看不到任何数据。
public static void InsertDataIntoSQLServerUsingSQLBulkCopy_2(DataTable dtable, string sqlTableName, Int32 batch_size, string connString)
{
try
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connString))
{
bulkCopy.DestinationTableName = sqlTableName;
try
{
bulkCopy.BulkCopyTimeout = 0;
bulkCopy.BatchSize = batch_size;
bulkCopy.WriteToServerAsync(dtable);
}
catch (Exception e)
{
Console.WriteLine(e.Message.ToString());
Environment.Exit(0);
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message.ToString());
Environment.Exit(0);
}
}
int batchsize = 0;
while (!reader.EndOfStream)
{
string[] line = reader.ReadLine().Split('\t');
datatable.Rows.Add(line);
batchsize += 1;
if (batchsize == flushed_batch_size)
{
InsertDataIntoSQLServerUsingSQLBulkCopy_2(dt, tabName, flushed_batch_size, connString);
dt.Rows.Clear();
batchsize = 0;
}
rows += 1;
}
InsertDataIntoSQLServerUsingSQLBulkCopy_2(dt, tabName, flushed_batch_size, connString);
dt.Rows.Clear();
我的InsertDataIntoSQLServerUsingSQLBulkCopy_2方法中是否缺少任何内容?
答案 0 :(得分:1)
我的回答并未解决您的性能问题。希望能帮助您确定数据未显示的原因。
帕特里克提到了评论中的第一个问题。但是,请务必更改签名以包含Task
而不是void
:
public static async Task InsertDataIntoSQLServerUsingSQLBulkCopy_2(
DataTable dtable, string sqlTableName, Int32 batch_size, string connString)
其次,您不会看到结果的一个潜在原因 - 或者看到不一致的结果 - 是因为您在Environment.Exit(0)
块中使用了catch
。
Environment.Exit与return
语句的不同之处在于它将立即终止应用程序和所有关联的线程。这可能是您没有看到任何数据的原因。
最后,您需要决定如何处理数据导入。如果插入行引发异常,您是否继续导入过程?您编写嵌套try..catch
的方式给人的印象是您希望它捕获错误但继续。但是,对Environment.Exit
的调用有效地使try..catch
成为冗余,因此在此时它只会变成代码重复。