我有一个包含大约一百万条记录的文本文件。将它们从C#插入SQL Server数据库的最佳方法是什么?
我可以使用BULK INSERT
吗?
答案 0 :(得分:5)
最好的方法是使用bcp
utility或SSIS workflow。这些工具有一些改进,如缓存和批处理,你会错过一个天真的实现。只要SQL Server引擎本身可以访问该文件,下一个最佳选项是BULK INSERT
语句。最后一个选项是SqlBulkCopy
类,它允许您的应用程序读取文件,可以处理并转换它,然后将数据作为枚举器提供给SqlBulkCopy。
答案 1 :(得分:1)
我最近处理过同样的问题,我意识到它有几个解决方案。
我写了一个BatchProgram(对于批处理程序设计,请阅读 - http://msdn.microsoft.com/en-us/magazine/cc164014.aspx)
您可以使用SQL Server Utilities BCP.exe或OSQL.exe或.net框架提供的SQLBulkCopy类。
我最终使用BCP(我有一个CSV文件并使用格式化文件并加载数据)和OSQL(我使用OSQL,我必须向存储过程提供文件)
我也去了.NET Process类并使用outputdatarecieved事件将BCP.exe的所有输出记录到控制台(阅读本文 - http://msdn.microsoft.com/en-us/library/system.diagnostics.process.outputdatareceived.aspx),这非常有效。
我也试过SQLBulkCopy类,但是如果你先将数据加载到datatable(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。
答案 2 :(得分:0)
使用C#是否需要?最快的方法是使用bcp命令行工具:http://msdn.microsoft.com/en-us/library/ms162802.aspx