Java insert跳过记录集中的最后一条记录
我正在编写一个程序,从一个模式中提取数据,重新构造数据以适应新的模式,然后将数据插入到具有新模式的新数据库中。问题是,在我的测试代码中,最后一条记录没有插入到新数据库中 我随信附上了下面代码的一个大大简化的版本,尽管如此,它还是重现了这个问题。有人能告诉我如何修复以下问题,以便将记录集中的所有记录插入目标数据库吗?目前,以下文件确实正确打印出system.out.println中的最后一条记录,但该最后一条记录随后未出现在目标表中:Java insert跳过记录集中的最后一条记录,java,jdbc,Java,Jdbc,我正在编写一个程序,从一个模式中提取数据,重新构造数据以适应新的模式,然后将数据插入到具有新模式的新数据库中。问题是,在我的测试代码中,最后一条记录没有插入到新数据库中 我随信附上了下面代码的一个大大简化的版本,尽管如此,它还是重现了这个问题。有人能告诉我如何修复以下问题,以便将记录集中的所有记录插入目标数据库吗?目前,以下文件确实正确打印出system.out.println中的最后一条记录,但该最后一条记录随后未出现在目标表中: static void migrateDataTest(){
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();}
}
奇怪的是,解决方案是在未能在其记录集中插入最终值的语句之后创建并执行另一个prepared语句。一旦我在后面添加了一个额外的准备好的语句,第一个语句就开始不断地插入它的所有值
看起来java代码中有些细微差别,可能是我在上面的原始帖子中发布的代码示例中缺少的。代码还可以,我想,System.out.println是否正在打印任何内容?有例外吗?@user2310289 System.out.println打印每一条记录,包括最后一条记录,它似乎永远不会出现在目标表中。1,2,4可以吗?您只插入了3项内容
ps5.setString(4,…)
如何验证丢失的记录?您是否在目标表上运行COUNT(*)
?@nachokk很好。我刚把它改成1,2,3。实际代码在多个表中插入许多其他变量。但是上面的代码确实重现了这个问题,并且没有用一堆不相关的代码分散这个站点上所有人的注意力。