【发布时间】:2016-04-12 14:21:57
【问题描述】:
我们使用CSVReader 导入一个csv 文件,然后使用SqlBulkCopy 将该数据插入SQL Server。这段代码适用于我们并且非常简单,但想知道是否有更快的方法(我们的一些文件有 100000 行)也不会变得太复杂?
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();
SqlTransaction transaction = conn.BeginTransaction();
try
{
using (TextReader reader = File.OpenText(sourceFileLocation))
{
CsvReader csv = new CsvReader(reader, true);
SqlBulkCopy copy = new SqlBulkCopy(conn, SqlBulkCopyOptions.KeepIdentity, transaction);
copy.DestinationTableName = reportType.ToString();
copy.WriteToServer(csv);
transaction.Commit();
}
}
catch (Exception ex)
{
transaction.Rollback();
success = false;
SendFileImportErrorEmail(Path.GetFileName(sourceFileLocation), ex.Message);
}
finally
{
conn.Close();
}
【问题讨论】:
-
我怀疑你会找到比这更快的东西。现在需要多长时间?您预计需要多长时间?
-
4 分钟,将包含 180,000 行的 csv 文件作为我们的测试数据。与我们宁愿不使用 SSIS 的 1.5 分钟相比。
-
如果性能在您的集成方案中至关重要,我会推荐 SSIS,即使它有其缺陷...在 SQL Server 2012+ 上,您还可以通过 Visual Studio 开发 SSDT。
-
CSV 文件中有多少个字段? 180k 行的文件有多大? 4 分钟对于只有 180k 行来说似乎异常长,尤其是对于通过
SqlBulkCopy进行直接插入的情况。此外,您的示例代码中可能存在复制/粘贴错误,因为它看到整个代码块被复制,而不是第一个finally块中的关闭}。 -
你到底在使用什么“CsvReader”代码?我发现了一些不同的,但我猜你正在使用它返回一个
DataTable。如果是这样,那么在调用SqlBulkCopy之前将整个 CSV 加载到内存中可以解释它所花费的 4 分钟,以及为什么 SSIS 没有花费这么长时间。与 SSIS 类似,我在answer 中描述的方法也将数据从文件流式传输到 SQL Server,因此它不会首先完全加载到内存中:-)。
标签: c# .net sql-server sqlbulkcopy