繁体   English   中英

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

[英]Bulk insert into SQL table from CSV using C#

我需要将数据从csv文件批量插入SQL 在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表结构,请告诉我

请帮助上面。

提前致谢

正如一些评论所建议的,我刚刚使用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

上面的代码在1分钟内成功处理了50mb +带有50k记录的xml文档。

繁重的任务是将数据从xml复制到datatable:一束用于上传的时间,一束用于xml-> datatable的时间,一秒用于数据库处理的时间。

如果您的数据采用的是“对数据表更友好”的格式,则可以轻松实现更好的性能。

我很确定您必须对行终止符和字段终止符使用反斜杠,因为看起来字符串已经将它们转换为实际字符0x10和0x09。 我认为一定是

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM