2013-10-11 3 views
2

하나의 스키마에서 데이터를 추출하고 새 스키마에 맞게 데이터를 재구성 한 다음 새 스키마가있는 새 데이터베이스에 데이터를 삽입하는 프로그램을 작성하고 있습니다. 문제는 내 테스트 코드에서 마지막 레코드가 새 데이터베이스에 삽입되지 않는다는 것입니다.insert는 레코드 세트의 마지막 레코드를 건너 뜁니다.

아래 코드를 크게 단순화 한 버전을 포함하고 있는데, 그럼에도 문제가 재현됩니다. 누구든지 레코드 집합의 모든 레코드가 대상 데이터베이스에 삽입되도록 아래 수정 방법을 보여 줄 수 있습니까? 현재, 아래의 올바르게에서 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();} 
} 

편집 : 록쉬의 요청에 따라

, 아래에이 오류를 만드는 전체 코드 블록을 넣을 것입니다. 나는 그것이 system.out.println에 레코드 30을 인쇄하고 있지만 대상 테이블에 레코드 번호 30이 없다는 것을 확인하기 위해 다시 실행했다. skipped 레코드가 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();} 
} 
+0

코드가 괜찮습니까? System.out.println이 인쇄됩니다. 어떤 예외입니까? –

+0

@ user2310289 System.out.println은 최종 레코드를 포함하여 모든 레코드를 인쇄합니다. 마지막 레코드는 대상 테이블에서 절대로 나타나지 않습니다. – CodeMed

+0

1,2,4는 괜찮습니까? 당신은 3 가지만 삽입하고 있습니다 ..'ps5.setString (4, ..)' – nachokk

답변

0

솔루션, 이상하게 만들고 해당 레코드의 마지막 값을 삽입에 실패했던 한 후 추가 준비된 문을 실행하는 것이 었습니다. 나중에 준비된 명령문을 추가하면 첫 번째 명령문은 모든 값을 일관되게 삽입하기 시작합니다.

Java 코드에서 약간의 뉘앙스가있는 것처럼 보입니다. 위의 원래 게시에 게시 한 코드 샘플에는 누락되었을 수 있습니다.

관련 문제