快速进入C#SqlBulkCopy

时间:2017-12-29 11:21:10

标签: c#

我正在从巨大的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方法中是否缺少任何内容?

1 个答案:

答案 0 :(得分:1)

我的回答并未解决您的性能问题。希望能帮助您确定数据未显示的原因。

帕特里克提到了评论中的第一个问题。但是,请务必更改签名以包含Task而不是void

public static async Task InsertDataIntoSQLServerUsingSQLBulkCopy_2(
    DataTable dtable, string sqlTableName, Int32 batch_size, string connString)

其次,您不会看到结果的一个潜在原因 - 或者看到不一致的结果 - 是因为您在Environment.Exit(0)块中使用了catch

Environment.Exitreturn语句的不同之处在于它将立即终止应用程序和所有关联的线程。这可能是您没有看到任何数据的原因。

最后,您需要决定如何处理数据导入。如果插入行引发异常,您是否继续导入过程?您编写嵌套try..catch的方式给人的印象是您希望它捕获错误但继续。但是,对Environment.Exit的调用有效地使try..catch成为冗余,因此在此时它只会变成代码重复。