2014-11-24 7 views
1

java에서 msaccess 데이터베이스에 연결하는 방법을 스스로 가르쳐려고합니다. 난 그냥 테이블에서 모든 것을 선택하려고 내 코드가 다음java.sql.SQLException : 잘못된 핸들

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 

public abstract class AccessDBConnect2 { 
    public static Connection connect(){ 
     String fileName = "C:/Users/Bridget/Documents/EmployeeSys.accdb"; 
     Connection con = null; 
     try { 
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
      String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ="+fileName; 
      con = DriverManager.getConnection(url,"",""); 
     } catch (Exception e) { 
      // Handle exceptions ... 
      System.out.println(e.toString()); 
      System.out.println("A problem accessing the database"); 
      e.printStackTrace(); 
     } finally { 
      try { if(con!=null) {con.close();} } catch (Exception e) {} 
     } 
     return con; 
    } 
public static void closeConnection(Connection conn){ 
    try{ 
     conn.close(); 
    }catch (Exception e){ 

    } 
} 

을 다음과 같이 데이터베이스에 액세스하는 클래스를 설정했습니다. msAccess에서 테이블을 만들었고 코드가 위의 코드에서 connect 메서드를 통해 문제없이 데이터베이스를 찾고 다소 액세스하는 것으로 나타납니다. 나는 연결을 사용하여의 prepareStatement를 호출 할 때 문제가 발생, 즉 코드 라인 :

stm = conn.prepareStatement(sql); 

전체 코드는 다음과 같습니다

import java.sql.*; 
public class Program2{ 
public static void main(String[] args) { 
     try{ 
      // Load the JDBC driver 
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); 

     // Establishing db connection 
     Connection conn = AccessDBConnect.connect(); 

     // Displaying all records from employee file 
     System.out.println("Display records of all employees"); 
     display(conn); 

     // Closing the connection 
     AccessDBConnect.closeConnection(conn); 
    }catch (Exception e){ 
     System.out.println("Error"); 
    } 
} 

// Display details of all employees 
public static void display(Connection conn){ 
    PreparedStatement stm = null; 
    // SQL statement 
    String sql = "SELECT * FROM Employee"; 
    ResultSet rs; 
    try { 
     stm = conn.prepareStatement(sql); // Prepare the SQL statement 
     rs = stm.executeQuery();   // Execture the SQL statement 

     // Navigate through the ResultSet and print 
     while (rs.next()){ 
      int id = rs.getInt("id"); 
      String name = rs.getString("name"); 
      String gender = rs.getString("gender"); 
      String address = rs.getString("address"); 

      System.out.println("ID: \t \t" + id); 
      System.out.println("Name: \t \t" + name); 
      System.out.println("Gender: \t" + gender); 
      System.out.println("Address: \t" + address); 
      System.out.println(" "); 
     } 

    // Closing the resultSet 
    rs.close(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 

public void test(){ 
    int a = "hello"; 
} 

은}

답변

2

.prepareStatement으로 전화를 걸려고하면 연결이 닫혀 있기 때문에 오류가 발생합니다. AccessDBConnect2 클래스에는 연결이 닫히기 전에 연결을 닫는 finally 블록이 포함되어 있습니다. 해당 클래스를 수정하여 연결이 열린 채로 둡니다.

그런데 JDBC-ODBC Bridge는 Java 8에서 제거되었으며 효과적으로 폐기되었습니다. 당신이 대안에 관심이있을 수 있습니다

Manipulating an Access database from Java without ODBC

+0

정말 고마워, 마침내 문제가됐다. 이것은 명백한 실수였습니다. 몇 시간이나 몇 시간 동안 당신을 미치게하는 유형이었습니다. Java 8에서 JDBC-ODBC의 대안을 살펴 보겠습니다. 다시 한번 감사드립니다. – Bridget

-1

나는 분명히 잘못된 답을 :) 제거했습니다 또 다른 가능성 :

나는이 문제가 데이터베이스에 연결되어 있다고 생각할 것이다. 'C : /Users/Bridget/Documents/EmployeeSys.accdb'을 변경해보십시오.
~
'C : \\ Users \ Bridget \ Documents \ EmployeeSys.accdb'

+0

아니, "값은 열의 인덱스 번호 나 열 이름을 사용하여 검색 할 수 있습니다." (ref : [here] (https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html)) –

+0

도움을 주셔서 감사합니다.하지만이 문제가 생기기 전에 제 문제가 있습니다. try 블록 내의 첫 번째 문에 있습니다. stm = conn.prepareStatement (sql); – Bridget

+0

미안하지만 위의 질문에 유감스럽게 생각합니다. 알고 있어야합니다. 문제가 데이터베이스에 연결되어 있다고 생각합니다. 'C : /Users/Bridget/Documents/EmployeeSys.accdb'를 다음과 같이 변경하십시오. 'C : \\ Users \ Bridget \ Documents \ EmployeeSys.accdb' – kbbucks