[英]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' )
如果您需要CSV
和SQL
表结构,请告诉我
请帮助上面。
提前致谢
正如一些评论所建议的,我刚刚使用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.