2016-12-14 103 views
3

我遇到了一些問題,試圖將我的列元數據與SQL Server批量複製API和SQLServerBulkCSVFileRecord映射。只是爲了測試目的,我做了一個表格只包含nvarchar(500)列,並添加這樣的元數據:如何使用SQL Server JDBC批量複製API

fileRecord = new SQLServerBulkCSVFileRecord(csvPath, false);  

for(int i=1; i<=colCount; i++) { 
    fileRecord.addColumnMetadata(i, null, java.sql.Types.NVARCHAR, 500, 0); 
} 

我得到與使用JDBC微軟SQL批量複製API,我無法找到任何文件後,下面的堆棧跟蹤在SQLServerBulkCSVFileRecord。我不知道addColumnMetaData中的參數是什麼意思:我只是假設看this的例子,第一個參數代表列索引,然後顯然是數據類型的第三個參數,第四個是列的字節數(?) 。

com.microsoft.sqlserver.jdbc.SQLServerException: Unicode data is odd byte size for column 1. Should be even byte size. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:217) 
    at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:251) 
    at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:81) 
    at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:36) 
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.doInsertBulk(SQLServerBulkCopy.java:1433) 
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.access$200(SQLServerBulkCopy.java:41) 
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy$1InsertBulk.doExecute(SQLServerBulkCopy.java:666) 
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:6276) 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1793) 
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.sendBulkLoadBCP(SQLServerBulkCopy.java:699) 
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.writeToServer(SQLServerBulkCopy.java:1516) 
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.writeToServer(SQLServerBulkCopy.java:616) 

,我讀了空行,非CRLF行結束符,編碼等可能有一定影響,但我覺得我已經用盡這些選項。

最後這裏是我的CSV文件的一個小樣本:

column1|test|1|testtest|test3 
column2|test|2|testt46426est|test346 
column3|test|3|test4test|test3426234 

回答

2

你沒有指定管道字符作爲字段分隔符。請注意,它需要因爲,根據documentation進行轉義爲"\\|"

CSV文件中指定的分隔符不應該在數據的任何地方出現,並應正確轉義如果是在Java中經常受限字符表達式。

我只是想下面的代碼和它的工作對我來說:

String csvPath = "C:/Users/Gord/Desktop/sample.txt"; 
SQLServerBulkCSVFileRecord fileRecord = 
     new SQLServerBulkCSVFileRecord(csvPath, null, "\\|", false); 

int colCount = 5; 
for (int i = 1; i <= colCount; i++) { 
    fileRecord.addColumnMetadata(i, null, java.sql.Types.NVARCHAR, 50, 0); 
} 

try (SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(conn)) { 
    bulkCopy.setDestinationTableName("dbo.so41144967"); 

    try { 
     // Write from the source to the destination. 
     bulkCopy.writeToServer(fileRecord); 
    } catch (Exception e) { 
     // Handle any errors that may have occurred. 
     e.printStackTrace(); 
    } 
} 
+0

謝謝你,這是事實確實如此。忘記分隔符我感到有點慚愧。你碰巧知道在其他地方是否有更詳盡的API文檔? –

+0

該文件是迄今爲止我發現的唯一參考文獻。 –