在sql2008 .NET 3.5上的.NET中的多行INSERT INTO

时间:2011-08-01 15:47:57

标签: c# .net database sql-server-2008

我将逗号分隔的CSV文件加载到作为C#中的XSLT转换的一部分生成的String值中 - (CLR程序集,控制台应用程序)。

我需要使用此C#应用程序将此CSV文件输出到数据库表中,一次输出1行。因为我对C#缺乏经验,所以我不知道如何最好地实现这个目标!

在SQL中,我通过以下SQL语句管理它:

INSERT INTO CsvData 
    (ID, sFilename, iLineCount, sData, dDate)
SELECT @ID, @Filename, id, val, CAST(getdate() as smalldatetime) 
  FROM dbo.split(@CSVFile,char(13))

dbo.split函数接受@CSVFile并且它是Delimeter(在这种情况下为char(13))并返回一个在CSVFile中每行有1行的表(id = identity,val = Linedata),然后使用填充CsvData表。

我无法将@CSV文件作为参数传递给SQL StroedProc,因为它可能非常大,所以要将它全部保存在C#代码中。

我如何才能在.NET中实现这一目标?

2 个答案:

答案 0 :(得分:1)

您可以使用.NET SqlClient提供程序中的 SqlBulkCopy 类。检查this MSDN article的用法。它提供了关于批量插入的良好性能。但是,您必须首先以结构化格式从CSV读取数据,因为SqlBulkCopy需要DataTable或IDataReader才能工作。您有两个选择:

  1. 将整个CSV文件加载到DataTable对象中,如果您的CSV文件非常大,这可能不是最佳解决方案
  2. 创建一个CsvDataReader作为CSV文件的只读,只进游标。您可以在网上找到一些实现。
  3. 由于您说您的CSV正在加载到String值中,因此用数据填充DataTable不会有问题。使用此DataTable作为SqlBulkCopy.WriteToServer方法的参数。

答案 1 :(得分:0)

尝试LINQ to CSV。

http://blogs.msdn.com/b/ericwhite/archive/2008/09/30/linq-to-text-and-linq-to-csv.aspx

这个实现意味着迭代而不是批量插入,但