SQLServerBulkCopy PostgreSQL для MS-SQL Server для NVARCHAR - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь использовать 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;
    }
}

Недавно перенесенные данные в неизвестном формате, см. Ниже

enter image description here

Но фактические данные должны быть такими, как показано ниже.

enter image description here

В своем Java-коде, чтобы выбрать данные из PostgreSQL, я попытался использовать простой запрос выбора, select * from test_data, но я получаю исключение

com.microsoft.sqlserver.jdbc.SQLServerException: тип данных other не поддерживается в массовом копировании.

Из этого следует, что при выборе данных типа данных text тип столбца в ResultSet равен Types.OTHER. Итак, чтобы избежать упомянутого исключения, я делаю текстовый тип на varchar, который возвращает типы как Types.VARCHAR.

Я использую драйвер sqlserver-jdbc 7.0.0

Может ли кто-нибудь помочь мне с этим.

...