【发布时间】: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