2014-11-24 2 views
1

Я пытаюсь научить себя, как подключиться к базе данных msaccess в java. Я создал класс для доступа к базе данных следующим образом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, и код, кажется, не прошел через метод подключения в приведенном выше коде без каких-либо проблем, указывая на то, что он находит базу данных и получает доступ к ней несколько. Проблема происходит, когда я называю 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 был удален из Java 8 и фактически устарел. Вы могли бы быть заинтересованы в этой альтернативе:

Manipulating an Access database from Java without ODBC

+0

Большое вам спасибо, наконец, проблема. Это была такая очевидная ошибка, как раз тот тип, который заставит вас сходить с ума по часам и часам. Я посмотрю на альтернативу JDBC-ODBC в Java 8. Еще раз спасибо – Bridget

-1

я удалил явно неправильный ответ :) другая возможность:

Я думаю, проблема связана с вашей базой данных, попробуйте изменить 'C: /Users/Bridget/Documents/EmployeeSys.accdb'к
«C: \\ Users \ Бриджит \ Documents \ EmployeeSys.accdb»

+0

Нет, «Значения могут быть получены с использованием либо порядковый номер столбца или имя столбца.» (ref: [здесь] (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: \\ Пользователи \ Bridget \ Documents \ EmployeeSys.accdb' – kbbucks

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