【发布时间】:2012-01-26 22:13:34
【问题描述】:
我有一个包含大约一百万条记录的文本文件。从 C# 将它们插入 SQL Server 数据库的最佳方法是什么?
我可以使用BULK INSERT吗?
【问题讨论】:
标签: c# .net sql-server
我有一个包含大约一百万条记录的文本文件。从 C# 将它们插入 SQL Server 数据库的最佳方法是什么?
我可以使用BULK INSERT吗?
【问题讨论】:
标签: c# .net sql-server
最好的方法是使用bcp utility 或SSIS workflow。这些工具有一些改进,比如缓存和批处理,你会在幼稚的实现中错过。下一个最佳选项是BULK INSERT 语句,只要 SQL Server 引擎本身可以访问该文件。最后一个选项是 SqlBulkCopy 类,它允许您的应用读取文件,可能对其进行处理和转换,然后将数据作为枚举数提供给 SqlBulkCopy。
【讨论】:
SqlBulkCopy 放在其他选项后面?
我最近处理了同样的问题,我意识到有几个解决方案。
我写了一个 BatchProgram(对于批处理程序设计,请阅读这个 - http://msdn.microsoft.com/en-us/magazine/cc164014.aspx)
您可以使用 SQL Server 实用程序 BCP.exe 或 OSQL.exe 或 .net 框架提供的 SQLBulkCopy 类。
我最终使用了 BCP(我得到了一个 CSV 文件并使用了一个格式化文件并加载了数据)和 OSQL(我使用了 OSQL,我必须向存储的 proc 提供一个文件)
我还去了 .NET Process 类并使用 outputdatarecieved 事件将 BCP.exe 的所有输出记录到控制台中(阅读此 - http://msdn.microsoft.com/en-us/library/system.diagnostics.process.outputdatareceived.aspx)这工作得很好。
我也尝试了 SQLBulkCopy 类,但是如果您首先将数据加载到数据表 (http://msdn.microsoft.com/en-us/library/ex21zs8x.aspx) 可能会很慢,如果您使用 IDataReader (http://msdn.microsoft.com/en-us/library/434atets.aspx) 可能会很快。
因为我有数百万行,所以我尝试使用 CSVReader (http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader),它非常快。但是在数据转换方面存在太多问题,而且我在 SQL 服务器端没有太多灵活性。
我最终使用了 BCP 和 OSQL。
【讨论】:
是否需要使用 C#?最快的方法是使用 bcp 命令行工具:http://msdn.microsoft.com/en-us/library/ms162802.aspx
【讨论】: