使用C#从CSV批量插入到SQL表中

时间:2014-10-09 13:31:23

标签: c# sql sql-server bulkinsert sqlbulkcopy

我需要从SQL文件批量插入数据到csv。在SQL中我使用命令:

bulk insert InputTestData
from 'D:\Project\UnitTestProjct\RGTestingToolTestProject\NUnitTestProject\RGTestToolDB\InputTestData.csv'
with
(   CODEPAGE ='RAW',
    rowterminator='\n',
    fieldterminator = '\t'
)

以上命令正在使用并在使用SQL查询分析器时插入数据,但是,使用下面给出的代码从C#执行时会引发错误:

 StringBuilder builder = new StringBuilder();
                                    builder.Append("bulk insert " + objectName + " from ");
                                    builder.Append("'" + ResourceFilePath + Path.DirectorySeparatorChar + objectPath + "'");
                                    builder.Append(" with");
                                    builder.Append(" (");                                       
                                    builder.Append(" rowterminator='\n',");
                                    builder.Append(" fieldterminator = '\t'");
                                    builder.Append(" )");

                                    SqlHelper.ExecuteNonQuery(transaction, CommandType.Text, builder.ToString());

它抛出错误:

Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1, column 8 (IsBaselineTest).

C#代码生成的查询在SQL查询分析器中也正常工作:

bulk insert InputTestData from 'D:\Project\UnitTestProjct\RGTestingToolTestProject\NUnitTestProject\\RGTestToolDB\InputTestData.csv' with ( rowterminator='
', fieldterminator = '  ',CODEPAGE ='RAW' )

如果您需要CSVSQL表结构

,请与我们联系

请在上面提供帮助。

先谢谢

2 个答案:

答案 0 :(得分:0)

我刚刚使用SqlBulkCopy完成了类似的任务,如某些评论所示。

我的源代码是XML文档,但情况非常相似。

我开发的解决方案是用于上传数据的Web界面,将一些代码放入数据表中,然后调用SqlBulkCopy以插入临时表。

最后一步是将数据插入到处理重复项并执行某些验证的最终表中的查询。

这里有一些代码(实际上是vb.net):

' create in memory datatable
' my choice has been to have the same datatype for all fields
Dim sapCustomer As DataTable = New DataTable("customer")
For Each SAPFieldName As String In SAPColMapping
  sapCustomer.Columns.Add(New DataColumn(SAPFieldName, GetType(System.String)))
Next

' fill previous table using xml data
For Each SapRow As XmlNode In RowList.SelectNodes("ROW")
  ... more code here to translate xml into datatable...
Next

' create temporary table on sql server
Using dbCmd As SqlCommand = New SqlCommand
  dbCmd.Connection = dbConn
  dbCmd.Transaction = dbTran
  dbCmd.CommandType = CommandType.Text
  dbCmd.CommandText = "create table #tempTable (your fields here)"
  dbCmd.ExecuteNonQuery
End Using

' fill temp table
Using sbc As SqlBulkCopy = New SqlBulkCopy(dbConn, SqlBulkCopyOptions.Default, dbTran)
  sbc.BatchSize = 1000
  ' no explicit mapping between source and destination fields
  ' because both tables have the very same field names
  sbc.DestinationTableName = "#tempTable"
  sbc.WriteToServer(sapCustomer)
End Using

' handle the steps needed to copy/move the data to the final destination
Using dbCmd As SqlCommand = New SqlCommand
  dbCmd.Connection = dbConn
  dbCmd.Transaction = dbTran
  dbCmd.CommandType = CommandType.Text
  dbCmd.CommandText = "insert into finaltable select field1, field2 from #tempTable"
  dbCmd.ExecuteNonQuery
End Using

以上代码成功处理xml文档50mb +,1分钟内有50k条记录。

繁重的任务是从xml到datatable的数据副本:一堆秒用于上传,40秒用于xml - > datatable和2秒用于数据库处理。

如果您的数据采用更“数据友好”的格式,您可以轻松获得更好的表现。

答案 1 :(得分:0)

我很确定你必须逃避行和字段终止符的反斜杠,因为它看起来像字符串已经将它们转换为实际字符0x10和0x09。我认为必须是

builder.Append(" rowterminator='\\n',"); 
builder.Append(" fieldterminator = '\\t'");