2014-10-02 2 views
1

스윙 GUI에서 얻은 정보를 사용하여 행을 업데이트하려고합니다. 데이터베이스 상호 작용과 연결JDBC 결과 집합을 사용하여 행을 업데이트 할 때의 문제

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]Error in row.BookFrame bUpdateActionPerformed 

BookDB 클래스 거래 : 이 내 예외입니다. eventhandling 및 사용자 입력을

public class BookDB { 

    private final String data = "jdbc:odbc:Books"; 
    private Connection con; 
    private Statement stmt; 
    ResultSet result; 

    BookDB() throws ClassNotFoundException, SQLException { 
     connect(); 
    } 

    public static void main(String[] args) { 
     try { 
      BookDB b = new BookDB(); 
     } catch (ClassNotFoundException ex) { 
      Logger.getLogger(BookDB.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (SQLException ex) { 
      Logger.getLogger(BookDB.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public void connect() throws ClassNotFoundException, SQLException { 
     try { 
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 

      this.con = DriverManager.getConnection(data); 
      this.stmt = this.con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 
      this.result = this.stmt.executeQuery("SELECT Bookcode,Booktitle,Bookprice FROM Books"); 
     } catch (ClassNotFoundException e) { 
      System.out.println("Failed to load jdbc/odbc drivers"); 
      System.out.println("Class Erro: " + e); 
     } catch (SQLException e) { 
      System.out.println("Unable to connect"); 
      System.out.println(("SQL ERROR: " + e)); 
     } 
    } 

    public void updateRecord(Book book) throws SQLException {  
     result.updateString("BookCode", book.getCode()); 
     result.updateString("BookTitle", book.getTitle()); 
     result.updateDouble("BookPrice", book.getPrice()); 
     result.updateRow(); 
    } 
} 

BookFrame 상품의

public class BookFrame extends javax.swing.JFrame { 

    private BookDB bd; 

    public BookFrame() { 
     try { 
      initComponents(); 
      this.bd = new BookDB(); 
      bd.connect(); //connect to database 
      bd.result.next(); 
      tCode.setText(this.bd.result.getString("bookcode") + ""); //sets textfields from data 
      tTitle.setText(this.bd.result.getString("booktitle") + ""); 
      tPrice.setText(this.bd.result.getString("bookprice") + ""); 
     } catch (ClassNotFoundException ex) { 
      Logger.getLogger(BookFrame.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (SQLException ex) { 
      Logger.getLogger(BookFrame.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private void bUpdateActionPerformed(java.awt.event.ActionEvent evt) { 
     try {    
      Book b = new Book(tCode.getText(), tTitle.getText(), Double.parseDouble(tPrice.getText())); //create book object of values to update with 
      bd.updateRecord(b); 
     } catch (SQLException ex) { 
      Logger.getLogger(BookFrame.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 
+1

액세스가 변경 가능한 결과 집합을 지원하지 않을 수 있습니다. 그렇다면 결과 집합의 커서 위치를 원하는대로 업데이트하려는 행으로 설정해야합니다. – MadProgrammer

+0

@MadProgrammer는이 경우 업데이트 테이블 범위가 없습니다 ? – Krishna

+0

당신이하는 방식이 아닙니다. Access 에서조차 mutable result set을 지원했지만, 당신이하고있는 방식은 작동하지 않을 것입니다. 하지만 평범한 일상적인 업데이트 문을 사용하여 수동 업데이트를해야합니다 ... – MadProgrammer

답변

1

난 당신이 ResultSet#updateRow를 호출 할 때 ResultSet 내의 현재 행의 위치에 문제가 있다고 생각한다. 하나의 레코드를 포함하는 [도서]라는 Access 테이블 ...

BookCode BookTitle     BookPrice 
-------- ------------------------- --------- 
BSFD  Brain Surgery for Dummies  4.95 

... 들어 다음과 같은 개념 증명 코드는 그것이를 데이터베이스에 행을 제공 할 수 업데이트입니다 것을 보여줍니다 ResultSet의 CurrentRow입니다.

"Book.java"- 책 객체

package com.example.resultsetupdate; 

import java.math.BigDecimal; 

public class Book { 
    private String code; 
    private String title; 
    private BigDecimal price; 

    public Book(String code, String title, BigDecimal price) { 
     super(); 
     this.code = code; 
     this.title = title; 
     this.price = price; 
    } 

    public String getCode() { 
     return code; 
    } 

    public void setCode(String code) { 
     this.code = code; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public BigDecimal getPrice() { 
     return price; 
    } 

    public void setPrice(BigDecimal price) { 
     this.price = price; 
    } 
} 

"BookDB.java"- 데이터베이스 조작

package com.example.resultsetupdate; 

import java.sql.*; 

public class BookDB { 

    private final String data = 
      "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};" + 
      "DBQ=C:\\Users\\Public\\mdbTest.mdb;"; 
    private Connection con; 
    private Statement stmt; 
    ResultSet result; 

    BookDB() throws SQLException { 
     connect(); 
    } 

    public void connect() throws SQLException { 
     this.con = DriverManager.getConnection(data); 
     this.stmt = this.con 
       .createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 
         ResultSet.CONCUR_UPDATABLE); 
     this.result = this.stmt 
       .executeQuery("SELECT BookCode, BookTitle, BookPrice FROM Books"); 
    } 

    public void close() throws SQLException { 
     this.con.close(); 
    } 

    public void updateRecord(Book book) throws SQLException { 
     result.updateString("BookCode", book.getCode()); 
     result.updateString("BookTitle", book.getTitle()); 
     result.updateBigDecimal("BookPrice", book.getPrice()); 
     result.updateRow(); 
    } 
} 

"Main.java"나는 실행 한 후

package com.example.resultsetupdate; 

import java.sql.SQLException; 

public class Main { 

    public static void main(String[] args) { 
     Book b = new Book(
       "WBIA", 
       "Why Bacon is Awesome", 
       java.math.BigDecimal.valueOf(1950, 2)); 
     BookDB bd; 
     try { 
      bd = new BookDB(); 
      bd.result.next(); // move to first row 
      bd.updateRecord(b); 
      bd.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(System.out); 
     } 
    } 

} 

액세스 테이블에 포함 된 코드

BookCode BookTitle    BookPrice 
-------- -------------------- --------- 
WBIA  Why Bacon is Awesome  19.50 
관련 문제