2014-10-09 90 views
0

我需要从csv文件将数据批量插入到SQL中。在SQL我使用命令:使用C#从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表结构

请上述帮助的。

由于提前

+0

您是否测试过查询分析器中由您的'StringBuilder'生成的查询? – 2014-10-09 13:44:20

+0

是的,它的工作,我已经更新查询也在问题块 – 2014-10-09 13:45:39

+0

你在C#中建立的字符串缺少参数'CODEPAGE'。如果你把它加回来做什么改变? – Paolo 2014-10-09 13:45:40

回答

0

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

builder.Append(" rowterminator='\\n',"); 
builder.Append(" fieldterminator = '\\t'"); 
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 +与50K纪录在1分钟。

繁重的任务是将数据从xml复制到数据表:xml数据表需要40秒 - >数据表和2秒数据库处理。

如果您的数据处于更友好的数据格式,您可以轻松获得更好的性能。