如何使用 SQL 服务器 JDBC 批量复制 API
How to use the SQL Server JDBC bulk copy API
我 运行 在尝试使用 SQL 服务器批量复制 API 和 SQLServerBulkCSVFileRecord
映射我的列元数据时遇到了一些问题。仅出于测试目的,我制作了一个仅包含 nvarchar(500)
列的 table 并添加如下元数据:
fileRecord = new SQLServerBulkCSVFileRecord(csvPath, false);
for(int i=1; i<=colCount; i++) {
fileRecord.addColumnMetadata(i, null, java.sql.Types.NVARCHAR, 500, 0);
}
在将 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.access0(SQLServerBulkCopy.java:41)
at com.microsoft.sqlserver.jdbc.SQLServerBulkCopyInsertBulk.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
您没有将竖线字符指定为字段分隔符。请注意,它需要转义为 "\|"
因为根据 documentation:
The delimiter specified for the CSV file should not appear anywhere in the data and should be escaped properly if it is a restricted character in Java regular expressions.
我刚刚尝试了以下代码,它对我有用:
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();
}
}
我 运行 在尝试使用 SQL 服务器批量复制 API 和 SQLServerBulkCSVFileRecord
映射我的列元数据时遇到了一些问题。仅出于测试目的,我制作了一个仅包含 nvarchar(500)
列的 table 并添加如下元数据:
fileRecord = new SQLServerBulkCSVFileRecord(csvPath, false);
for(int i=1; i<=colCount; i++) {
fileRecord.addColumnMetadata(i, null, java.sql.Types.NVARCHAR, 500, 0);
}
在将 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.access0(SQLServerBulkCopy.java:41)
at com.microsoft.sqlserver.jdbc.SQLServerBulkCopyInsertBulk.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
您没有将竖线字符指定为字段分隔符。请注意,它需要转义为 "\|"
因为根据 documentation:
The delimiter specified for the CSV file should not appear anywhere in the data and should be escaped properly if it is a restricted character in Java regular expressions.
我刚刚尝试了以下代码,它对我有用:
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();
}
}