2014-11-24 162 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 2014-11-30 16:00:23

-1

我已經刪除了明顯不正確的答案:)另一種可能性:

我想這個問題是在你的數據庫連接中,請嘗試更改'C:/Users/Bridget/Documents/EmployeeSys.accdb'

'C:\\ Users \ Bridget \ Documents \ EmployeeSys.accdb'

+0

否「就可以利用列的索引編號或列的名稱檢索值。」 (參考:[這裏](https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html)) – 2014-11-24 17:41:17

+0

感謝您的幫助,但我的問題是在我接觸到這個聲明之前。它在try塊內的第一個語句: stm = conn.prepareStatement(sql); – Bridget 2014-11-25 18:58:01

+0

對不起,這是上面的一個懶惰的答案!,我應該知道 - 我想這個問題是在你的數據庫連接,嘗試改變'C:/Users/Bridget/Documents/EmployeeSys.accdb'到'C:\\ Users \ Bridget \ Documents \ EmployeeSys.accdb' – kbbucks 2014-11-28 20:31:07