我看了一会,也觉得有点奇怪,但你看看,你的Bean里的构造方法
public faq_access()里就加载了驱动(connection、Statement),但在你的execute方法里为何又写一遍呢,写Bean不就为了代码的重用么?很有可能是这里错了,你把execute方法里的这三句去掉!
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:faq_access","","");
stmt=con.createStatement();
1. 错误一定在public ResultSet execute(String sql)这个METHOD里
原因是while(rs.next()) 被thrown了一个NullPointerException说明rs是NULL, 那么15: ResultSet rs = faq_access.execute("select * from faq");
中.execute这个METHOD中一定有了EXCEPTION, 所以METHOD .execute会return null.
2.解决方法:
第一, 去掉class faq_access, 中的constructor, 多余的Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:faq_access","","");
stmt=con.createStatement(); 这些
第二, METHOD .execute改为:
public ResultSet execute(String sql)
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:faq_access","","");
stmt=con.createStatement();
rs=stmt.executeQuery(sql);
}
catch(Exception e)
{
e.printStackTrace(); //这样它就显示出 错误的根本原因是什么
}
return rs;
}
}
3. 然后你在看看PRINT出来什么EXCEPTION, 此是才知道究竟是什么错误.
我猜想可能是con = DriverManager.getConnection("jdbc:odbc:faq_access","",""); 中, 后两个argument为数据库的user name, password, 一般不需要, 因为MS ACCESS是很简单的, 所以改为:con = DriverManager.getConnection("jdbc:odbc:faq_access");
几个问题
首先,你是MS access数据库,那就缺少access驱动和地址路径.
其次,你在构造函数的时候已经建立了connection和statement,下面的方法你又加上,那构造函数里的就没有意义了
第三,sql语句不严格,缺少;结尾
第四,在你的定义中,excute只能执行查询语句,因为他要返回一个resultset,如果你是删除,更改,创建那就需要使用excuteUpdate(sql)的句法了
第五,只有rs关闭,没有stmt,conn的关闭,产生内存滞留
第六,异常抛出没有处理
综合以上几点,无论是程序设计,代码归法都不合格。
下面附access 可复用代码
import java.sql.*;
public class dbAction
{
String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
String sConnStr = "jdbc:odbc:bka";
String dbq = "DBQ=E:\\Java\\database\\db.mdb";
String driver = "Driver={Microsoft Access Driver (*.mdb)}";
String connectionString = "jdbc:odbc:"+driver+";"+dbq;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
public dbAction(){
try {
Class.forName(sDBDriver);
}
catch(java.lang.ClassNotFoundException e) {
System.err.println("bka(): " + e.getMessage());
}
}
public ResultSet executeQuery(String sql) {
rs = null;
try {
conn = DriverManager.getConnection(connectionString);
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = stmt.executeQuery(sql);
}
catch(SQLException ex) {
System.err.println("aq.executeQuery: " + ex.getMessage());
}
return rs;
}
public Boolean updateQuery(String sql) {
rs = null;
boolean su;
try {
conn = DriverManager.getConnection(connectionString);
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
stmt.executeUpdate(sql);
su = true;
}
catch(SQLException ex) {
System.err.println("aq.executeQuery: " + ex.getMessage());
su=false;
}
return su;
}
public void closeStmt()
{
try
{
stmt.close();
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void closeLink()
{
try
{
conn.close();
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
经无数测试与使用,完全可执行。
记得更改你的绝对地址路径,还要记得rs执行完后关闭是stmt和conn。