2

我正在编写一个程序,该程序从一个模式中提取数据,重组数据以适应新模式,然后将数据插入到具有新模式的新数据库中。问题是,在我的测试代码中,最后一条记录没有插入到新数据库中。

我附上了下面代码的一个大大简化的版本,它仍然重现了这个问题。谁能告诉我如何修复以下问题,以便将记录集中的所有记录插入目标数据库?目前,以下确实正确打印出 system.out.println 中的最后一条记录,但之后最后一条记录不存在于目标表中:

static void migrateDataTest(){
    try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection sourceConn = DriverManager.getConnection("jdbc:odbc:source_data_test");
        Statement st = sourceConn.createStatement();
        Connection destinationConn = DriverManager.getConnection("jdbc:odbc:receive_data_test");
        int ClientNumber; String ClientsLastName; String ClientsFirstName;
        ResultSet rest = st.executeQuery("SELECT ClientNumber, ClientsLastName, ClientsFirstName FROM sourceTable");
        PreparedStatement ps5 = null;
        while(rest.next()){
            ClientNumber = rest.getInt(1);
            ClientsLastName = rest.getString(2);
            ClientsFirstName = rest.getString(3);
            System.out.println(ClientNumber+", "+ClientsLastName+", "+ClientsFirstName);
            ps5 = destinationConn.prepareStatement(
                "INSERT INTO destinationTable ("
                + "ClientNumber, FirstName, LastName) VALUES (?, ?, ?)"
            );
            ps5.setInt(1, ClientNumber);
            ps5.setString(2, ClientsFirstName);
            ps5.setString(3, ClientsLastName);
            ps5.executeUpdate();
            destinationConn.commit();
        }
        ps5.close();
    }
catch (ClassNotFoundException cnfe){cnfe.printStackTrace();}
catch (SQLException e) {e.printStackTrace();}
}  

编辑:

根据 Lokesh 的要求,我将创建此错误的整个代码块放在下面。我只是再次运行它以确认它正在打印 system.out.println 中的记录 30,但目标表不包含记录号 30。跳过的记录正在使用 system.out.println 打印出来这一事实使我相信下面的代码包含错误:

static void migrateDataTest(){
    try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection sourceConn = DriverManager.getConnection("jdbc:odbc:source_test");
        Statement st = sourceConn.createStatement();
        Connection destinationConn = DriverManager.getConnection("jdbc:odbc:receive_data_test");
        int ClientNumber;
        String ClientsLastName;
        String ClientsFirstName;
        String ClientsMiddleInitial;
        Date DOB;
        int GenderNumber;
        int RaceNumber;
        ResultSet rest = st.executeQuery("SELECT ClientNumber, ClientsLastName, ClientsFirstName, ClientsMiddleInitial, DOB, GenderNumber, RaceNumber FROM sourceTable");
        PreparedStatement ps5 = null;
        while(rest.next()){
            ClientNumber = rest.getInt(1);
            ClientsLastName = rest.getString(2);
            ClientsFirstName = rest.getString(3);
            ClientsMiddleInitial = rest.getString(4);
            DOB = rest.getDate(5);
            GenderNumber = rest.getInt(6);
            RaceNumber = rest.getInt(7);
            System.out.println(ClientNumber+", "+ClientsLastName+", "+ClientsFirstName+", "+ClientsMiddleInitial+", "+DOB+", "+GenderNumber+", "+RaceNumber);  
            ps5 = destinationConn.prepareStatement(
                "INSERT INTO destinationTable ("
                + "ClientNumber, FirstName, MiddleInitial, LastName, DOB, GenderNumber, RaceNumber) "
                +"VALUES (?, ?, ?, ?, ?, ?, ?)"
            );
            ps5.setInt(1, ClientNumber);
            ps5.setString(2, ClientsFirstName);
            ps5.setString(3, ClientsMiddleInitial);
            ps5.setString(4, ClientsLastName);
            ps5.setDate(5, DOB);
            ps5.setInt(6, GenderNumber);
            ps5.setInt(7, RaceNumber);
            ps5.executeUpdate();
            destinationConn.commit();
        }
        ps5.close();
    }
    catch (ClassNotFoundException cnfe){cnfe.printStackTrace();}
    catch (SQLException e) {e.printStackTrace();}
}
4

1 回答 1

0

奇怪的是,解决方案是在未能将最终值插入其记录集中的语句之后创建并执行额外的准备好的语句。之后我添加了一个额外的准备好的语句,第一个语句开始一致地插入它的所有值。

我在上面的原始帖子中发布的代码示例中可能缺少 java 代码中的一些细微差别。

于 2013-10-13T16:58:26.290 回答