java.sql.SQLException:无效的句柄
我想教自己如何连接到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";
}
}
您收到错误消息,因为当您尝试拨打.prepareStatement
时,连接已关闭。您的AccessDBConnect2
类包含一个finally
块,它在返回之前关闭连接。修复该类,以使连接保持打开状态。
顺便说一下,JDBC-ODBC Bridge已从Java 8中删除,并且已被废弃。你可能有兴趣在这个替代:
我已经删除了明显不正确的答案:)另一种可能性:
我想这个问题是在你的数据库连接中,请尝试更改'C:/Users/Bridget/Documents/EmployeeSys.accdb'
到
'C:\\ Users \ Bridget \ Documents \ EmployeeSys.accdb'
否“就可以利用列的索引编号或列的名称检索值。” (参考:[这里](https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html)) – 2014-11-24 17:41:17
感谢您的帮助,但我的问题是在我接触到这个声明之前。它在try块内的第一个语句: stm = conn.prepareStatement(sql); – Bridget 2014-11-25 18:58:01
对不起,这是上面的一个懒惰的答案!,我应该知道 - 我想这个问题是在你的数据库连接,尝试改变'C:/Users/Bridget/Documents/EmployeeSys.accdb'到'C:\\ Users \ Bridget \ Documents \ EmployeeSys.accdb' – kbbucks 2014-11-28 20:31:07
非常感谢你,最后是问题所在。 这是一个明显的错误,只会让你疯狂几个小时。 我将看看Java 8中JDBC-ODBC的替代方案。 再次感谢 – Bridget 2014-11-30 16:00:23