2016-12-14 4 views
3

Я столкнулся с некоторыми проблемами, пытающимися сопоставить мои метаданные столбца с API-интерфейсом SQL Server Bulk Copy и SQLServerBulkCSVFileRecord. Только для целей тестирования я создал таблицу, состоящую только nvarchar(500) столбцов и добавить метаданные, как это:Как использовать API избыточного копирования JDBC SQL Server

fileRecord = new SQLServerBulkCSVFileRecord(csvPath, false);  

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

я получаю следующее StackTrace после использования Microsoft SQL массового копирования API с помощью JDBC и я не могу найти никакой документации на 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

Этот документ является единственной ссылкой, которую я нашел до сих пор. –

Смежные вопросы