2013-12-19 3 views
-1

У меня возникла проблема с методом next(), когда я пытаюсь вставить значения из таблицы из while (sr.next()), они бросают ResultSet Exception, но когда я буду извлекать запрос вставки из тела времени он работает так, почему ResultSet закрыт, когда я тренируюсь, чтобы вставить значения в то время как тело здесь кодИсключение ResultSet закрывается при использовании метода next()

import java.io.IOException; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.Scanner; 

public class SqlServerJDBC { 


    public static void main(String[] args) throws IOException { 
     String line, dis; 
     float totalPrice = 0; 
     Scanner scan= new Scanner(System.in); 

     try { 
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
        System.out.println("# - Driver Loaded"); 

        Connection con =    DriverManager.getConnection("jdbc:odbc:books_DSN"); 
        System.out.println("# - Connection Obtained"); 

        Statement stmt = con.createStatement(); 
        System.out.println("# - Statement Created"); 

        String createTableOrder = "create table viewOrder" 
              + "(title_name VARCHAR(40)," 
              + "price DECIMAL(5,2)," 
              + "pages INT," 
              + "au_fname VARCHAR(15)," 
              + "au_lname VARCHAR(15)," 
              + "pub_name VARCHAR(20)," 
              + "city VARCHAR(15)," 
              + "country VARCHAR(15))"; 



        stmt.executeUpdate(createTableOrder); 
        System.out.println("Created table in given database..."); 

        ResultSet rs = stmt.executeQuery("SELECT title_name,price FROM titless"); 
        System.out.println("# - Query Executed\n"); 

        while(rs.next()){ 
         System.out.println("title: " +rs.getString("title_name") + "\tprice: " + rs.getFloat("price"));    
        } 

         do { 
          System.out.println("\nEnter the name of the book..."); 
          line = scan.nextLine(); 
          rs = stmt.executeQuery("select title_name,price,pages,au_fname" 
            + ",au_lname,pub_name,authorss.city,country " 
            + " from titless inner join title_authorss on titless.title_id = title_authorss.title_id " 
            + " inner join authorss on title_authorss.au_id = authorss.au_id" 
            + " inner join publisherss on publisherss.pub_id = titless.pub_id" 
            + " where titless.title_name like "+"'"+line+"'"); 


          /*here is the problem */ 
           while(rs.next()){ 

           String insertIntoTableOrder =("INSERT INTO viewOrder " 
             + " VALUES ('"+rs.getString("title_name")+"',"+rs.getFloat("price")+","+rs.getInt("pages")+"" 
             + ",'"+rs.getString("au_fname")+"','"+rs.getString("au_lname")+"'," 
             + "'"+rs.getString("pub_name")+"','"+rs.getString("city")+"','"+rs.getString("country")+"')"); 
           stmt.executeUpdate(insertIntoTableOrder); 

           totalPrice = totalPrice + rs.getFloat("price"); 


          } 


          System.out.println("Total Price = " + totalPrice); 
          System.out.println("Do you want add more books ??"); 
          System.out.println("Y/N..."); 
          dis = scan.nextLine(); 


         } while (dis.equalsIgnoreCase("y")); 



         con.close(); 
         stmt.close(); 
         rs.close(); 

        System.out.println("# - Resources released"); 

       } catch (SQLException | ClassNotFoundException ex) { 
          System.out.println("Error : "+ex); 
      } 

    } 

    } 

here is the output

+0

вы закроете время цикла еще до того, чтобы получить электронную возможность получить rs.next() – Diversity

+0

кажется, что вы работаете ExecuteQuery на одном объекте ResultSet в то время как внутри rs.next время цикла. Для этого есть причина? Может быть, если бы вы использовали другой объект ResultSet, это решило бы эту проблему? –

ответ

0

Вам нужен другой объект Statement. Вызов второго запроса в вашем сингулярном заявлении, в то время как итерация ResultSet (привязанная к курсору по тому же заявлению) - плохая идея.

2

В соответствии с Документами:

По умолчанию, только один объект ResultSet в себе объект может быть открыт одновременно. Поэтому, если чтение одного объекта ResultSet чередуется с чтением другого, каждый из них должен быть сгенерирован различными объектами Statement. Все методы выполнения в интерфейсе Statement неявно закрывают текущий объект ResultSet, если существует открытый.

http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html

Вы итерацию через ResultSet и повторно использовать один и тот же Statement сделать свой INSERT. Как только вы выполните вставку, завершающийся итерационный код закрыт, и следующий вызов rs.next() вызывает это исключение. Вам нужно будет использовать новый Statement для выполнения запроса на вставку внутри цикла.

Тем не менее, вы действительно должны использовать подготовленные операторы для своего SQL. Это чище с точки зрения чтения вашего кода и гораздо меньше подверженности ошибкам, поскольку они обрабатывают любые необходимые цитаты для вас.

String statementString = "INSERT INTO viewOrder VALUES (?,?,?,?,?,?,?,?)"; 
PreparedStatement pStmt= con.prepareStatement(statementString); 
while(rs.next()) 
{ 
    pStmt.setString(1, rs.getString("title_name")); 
    pStmt.setFloat(2, rs.getFloat("price")); 
    pStmt.setInt(3, rs.getInt("pages")); 
    pStmt.setString(4, rs.getString("au_fname")); 
    pStmt.setString(5, rs.getString("au_lname")); 
    pStmt.setString(6, rs.getString("pub_name")); 
    pStmt.setString(7, rs.getString("city")); 
    pStmt.setString(8, rs.getString("country")); 
    pStmt.execute(); 

    totalPrice = totalPrice + rs.getFloat("price"); 
} 
+1

похоже тоже не проблема. Потому что в этом случае вы просто получаете какое-то исключение ресурса базы данных. Рядом с ним я думаю, что должна быть какая-то логическая проблема. – Diversity

+0

Эмм, нет ... он делает то, что я сказал, и получаю точное исключение, которого можно было бы ожидать. Нет «логической проблемы». Если бы он использовал отдельное заявление для своей вставки, он будет работать нормально. –

Смежные вопросы