【问题标题】:The conversion from UNKNOWN to UNKNOWN is unsupported exception (in Java program for migration)从 UNKNOWN 到 UNKNOWN 的转换是不支持的异常(在 Java 程序中用于迁移)
【发布时间】:2020-01-22 16:00:44
【问题描述】:

我有一个程序可以将数据从 oracle 数据库迁移到具有相同结构的 SQL Server 数据库。 private void migrateAllDataToMssql() 抛出异常 {

    Connection connOracle = DBConnection.getConnection();
    Connection connMssql = DBConnection.getConnectionToMsSql();

    Statement selectAll = connOracle.createStatement();

    ResultSet tableResultSet = selectAll.executeQuery("select table_name from dba_tables where owner= 'USER1'");

            //insert to mssql db
     while(tableResultSet.next()) {
         String tableName = tableResultSet.getString("table_name");
         if(tableName.equals("DATABASECHANGELOG_CORE") || tableName.equals("GLOBAL_PARAM") || 
             tableName.equals("LOG") || tableName.equals("ORDERS") ||  tableName.equals("ORDER_BOOK")) {             
             System.out.println("do nothing");
         }
         else {
             System.out.println(tableName);
             try (PreparedStatement s1 = connOracle.prepareStatement("select * from " + tableName);
                     ResultSet rs = s1.executeQuery()) {
                    ResultSetMetaData meta = rs.getMetaData();

                    List<String> columns = new ArrayList<>();
                    for (int i = 1; i <= meta.getColumnCount(); i++)
                        columns.add(meta.getColumnName(i));

                     String identityInsertOn = "";
                     String sql = "INSERT INTO " + tableName + " ("
                              + columns.stream().collect(Collectors.joining(", "))
                              + ") VALUES ("
                              + columns.stream().map(c -> "?").collect(Collectors.joining(", "))
                              + ")";
                     String identityInsertOff = "";

                     if(tableName.equals("COMMODITY") || tableName.equals("DELIVERY_CODE") ||
                     tableName.equals("DELIVERY_CODE_ENUM") || tableName.equals("INS_CLASS") || 
                         tableName.equals("ORDER_TYPE")  || tableName.equals("PRIVS_TO_ROLES") ||
                     tableName.equals("PROD_DEF_GROUP") || tableName.equals("RESULTS") || 
                         tableName.equals("ROLES")) {
                         identityInsertOn = "SET IDENTITY_INSERT " + tableName + " ON ";
                         identityInsertOff = " SET IDENTITY_INSERT " + tableName + " OFF ";
                     }
                    System.out.println(sql);

                    try (PreparedStatement s2 = connMssql.prepareStatement(
                           identityInsertOn +
                           sql +
                           identityInsertOff
                    )) {

                        while (rs.next()) {
                            for (int i = 1; i <= meta.getColumnCount(); i++) {
                                System.out.println(meta.getColumnType(i) + " " + i); //log which data type the column has

                                    s2.setObject(i, rs.getObject(i));

                            }


                            s2.addBatch();
                        }

                        s2.executeBatch();
                    }
                }
     }}

    }

它实际上工作正常,但在某些表中会出现此 SQLServerException:

线程“main”com.microsoft.sqlserver.jdbc.SQLServerException 中的异常:不支持从 UNKNOWN 到 UNKNOWN 的转换。 在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:234) 在 com.microsoft.sqlserver.jdbc.DataTypes.throwConversionError(DataTypes.java:1094) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObject(SQLServerPreparedStatement.java:1595) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObjectNoType(SQLServerPreparedStatement.java:1493) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObject(SQLServerPreparedStatement.java:1502) 在 test.DatabaseDataMigrator2.migrateAllDataToMssql(DatabaseDataMigrator2.java:179) 在 test.DatabaseDataMigrator2.main(DatabaseDataMigrator2.java:36)

我检查了这些表具有哪些数据类型,并且它们的共同点是它们的每个表中都有一个 TIMESTAMP 数据类型,但是在其他一些也出现 TIMESTAMP 的表中,没有出现异常。此异常的原因可能是什么?

【问题讨论】:

  • 您不认为应该使用工具进行迁移,而不是自己编程吗?
  • 是的,我确实想要,但这是我必须自己开发的任务

标签: java sql database exception migration


【解决方案1】:

我只需要检查它是否是时间戳列,如果是,则将 setObject 替换为 setDate

while (rs.next()) {
    for (int i = 1; i <= meta.getColumnCount(); i++) {
         System.out.println("Column type: " + meta.getColumnType(i) + " Iteration: " + i); //log which data type the column has
         if(meta.getColumnType(i) == 93) {
              s2.setDate(i, rs.getDate(i));
        }else {
              s2.setObject(i, rs.getObject(i));
                                }                                   
                            }

根据documentation columnType==93 表示时间戳,因此这是在 if 子句中检查的内容。之后插入和设置工作正常。

【讨论】:

    猜你喜欢
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2018-08-03
    • 2015-03-17
    • 2016-05-16
    相关资源
    最近更新 更多