批量将CSV文件插入到具有特定格式

时间:2018-03-12 10:59:53

标签: c# sql sql-server tsql backend

我正在尝试通过C#中的迁移进行批量插入,到目前为止看起来像这样

    public override void Up()
    {
        Sql("BULK INSERT Test FROM 'C:\\test.csv' 
             WITH (
                   FORMATFILE = 'C:\\format.xml',
                   FIRSTROW = 2);"
             );
    }

test.csv

Id  Name    Birthday    Status
1   John    23-11-1984 00:00    OK
2   Peter   17-05-1986 00:00    N/A
3   James   18-03-1987 00:00    OK

format.xml

<?xml version="1.0"?>  
<BCPFORMAT   
xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format"   
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <RECORD>  
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t"   MAX_LENGTH="12"/>
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\t"   MAX_LENGTH="20" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\t"   MAX_LENGTH="30"/>
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="30" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
  </RECORD>  
  <ROW>  
    <COLUMN SOURCE="1" NAME="Id" xsi:type="SQLINT"/>
    <COLUMN SOURCE="2" NAME="Name" xsi:type="SQLVARYCHAR"/>
    <COLUMN SOURCE="3" NAME="Birthday" xsi:type="SQLDATETIM8"/>
    <COLUMN SOURCE="4" NAME="Status" xsi:type="SQLBIT"/>
  </ROW>
</BCPFORMAT>

测试表定义

Id (PK, not null)
Name (nvarchar(max), null)
Birthday (datetime, null)
Status (bit, null)

在updatig数据库之后我遇到了第一个错误(CSV中生日的日期格式是DD-MM-YYYY HH:MM):

  

批量加载数据转换错误(类型不匹配或无效字符   对于第3行,第3列(生日)的指定代码页。

但如果我在CSV文件中将日期格式更改为YYYY-MM-DD HH:SS,则可以正常工作。

第二个问题是对于字段&#39; Active&#39;在CSV中,我需要接受字符串&#34; OK&#34;或&#34; N / A&#34;并以某种方式转换它并将其作为位插入表中。

所以在这一点上,我的问题是:

  • 在将数据插入表格之前,有没有办法转换这些数据?

0 个答案:

没有答案