Я пытаюсь использовать SQLServerBulkCopy для переноса данных из PostgreSQL в MS-SQL Server. У меня проблема с неанглийскими символами (Unicode). Для хранения этих данных в PostgreSQL text
тип данных и для MS-SQL используется nvarchar
.
Это фрагмент кода
public class MssqlBulkLoad {
public static void main(String args[]) throws SQLException {
String sql = "select id, data::varchar from test_data";
Connection pgConn = getPgConnection();
Statement pgStmt = pgConn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
pgStmt.setFetchSize(200);
Connection sqlServerConn = getSQLServerConnection();
SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(sqlServerConn);
bulkCopy.setBulkCopyOptions(options());
bulkCopy.setDestinationTableName("TEST_DATA2");
ResultSet pgResultSet = pgStmt.executeQuery(sql);
printMeta(pgResultSet);
bulkCopy.writeToServer(pgResultSet);
pgResultSet.close();
bulkCopy.close();
sqlServerConn.close();
pgStmt.close();
pgConn.close();
}
private static void printMeta(ResultSet pgResultSet) throws SQLException {
ResultSetMetaData rsmd = pgResultSet.getMetaData();
int c = rsmd.getColumnCount();
for (int i = 1; i <= c; i++) {
System.out.println(rsmd.getColumnType(i) + "\t" + rsmd.getColumnTypeName(i));
}
}
private static SQLServerBulkCopyOptions options() throws SQLException {
SQLServerBulkCopyOptions options = new SQLServerBulkCopyOptions();
options.setBulkCopyTimeout(60000);
options.setKeepIdentity(true);
options.setBatchSize(50);
return options;
}
}
Недавно перенесенные данные в неизвестном формате, см. Ниже
Но фактические данные должны быть такими, как показано ниже.
В своем Java-коде, чтобы выбрать данные из PostgreSQL, я попытался использовать простой запрос выбора, select * from test_data
, но я получаю исключение
com.microsoft.sqlserver.jdbc.SQLServerException: тип данных other не поддерживается в массовом копировании.
Из этого следует, что при выборе данных типа данных text
тип столбца в ResultSet равен Types.OTHER
. Итак, чтобы избежать упомянутого исключения, я делаю текстовый тип на varchar
, который возвращает типы как Types.VARCHAR
.
Я использую драйвер sqlserver-jdbc 7.0.0
Может ли кто-нибудь помочь мне с этим.