100分请教JSP使用MS ACCESS数据库后的怪异问题

lhzongji 2004-08-20 03:52:08
我的连接使用的是:

String strUrl="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + fileName;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");


数据库是能正常连接。可是连接后有许多问题。例如一些值,我不能从ResultSet里访问两次。还有传统的SQL语句使用后都会有错误,一些SQL语句明明在ACCESS中可以查询到,可是JSP中使用Statement查询后的数据根本就不对。

例如
select count(1) from (select ADM from ATABLE union select ADM from BTABLE union select ADM from CTABEL)

这个SQL语句居然报错,说是FROM子语句有问题。可我明明在ACCESS的查询中运行成功的。

改了改SQL语句。
select ADM from ATABLE union select ADM from BTABLE union select ADM from CTABEL
在JSP中运行是没问题。可是得到的ResultSet居然少了N行数据。

这到底是怎么回事??
...全文
216 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
lhzongji 2004-08-23
  • 打赏
  • 举报
回复
调用rs.next()后再调用rs.last()还是一样。得到的结果集行数为1。

同样的SQL语句,去了ACCESS中直接查询得到的确是5

lhzongji 2004-08-23
  • 打赏
  • 举报
回复
zhushizu(从来就没有救世祖)

我这个是客户端上传来的数据库文件,每个文件名都不固定。怎么建ODBC?
perryhg 2004-08-23
  • 打赏
  • 举报
回复
[Microsoft][ODBC 驱动程序 管理器] 未发现数据源名称并且未指定默认驱动程序 意思是没有找到mdb文件,如果你的mdb文件和jsp在一个目录下面,不能保证你的java程序会按照这个路径去寻找这个文件,
你应该先 File f = new File("test.mdb");
String connStr = "jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)};dbq="+f.getAbsolutePath();

perryhg 2004-08-23
  • 打赏
  • 举报
回复
import java.sql.*;
import java.lang.*;
public class conn
{
public static void main(String[] args){
Connection con;

try{

String connStr = "jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)};dbq=test.mdb";

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

con = DriverManager.getConnection(connStr);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from User");
//rs.last();
int intRowCount = rs.getRow();
System.out.println(intRowCount);
}catch(ClassNotFoundException e){
System.err.println(e.getMessage());
}catch(SQLException e){
System.err.println(e.getMessage());
}

//stmt.close();
//con.close();
}
}
perryhg 2004-08-23
  • 打赏
  • 举报
回复
"jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=test.mdb"

问题不在Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");那里,Class.forName是一定要try的,这个是对的,你的错误信息是
[Microsoft][ODBC 驱动程序 管理器] 未发现数据源名称并且未指定默认驱动程序

说明没找到数据库文件,你要确认你的数据库文件在当前目录下面,并且文件名大小写和你程序里面指定的完全一致。
whoopee 2004-08-22
  • 打赏
  • 举报
回复
顶一下先
lxleaves 2004-08-21
  • 打赏
  • 举报
回复
同上,呵呵,必须先调用一次rs.next
whoopee 2004-08-21
  • 打赏
  • 举报
回复
to zhushizu(从来就没有救世祖)

我就是想免odbc数据源!

****************************************
to lhzongji(踪迹)

你编译的时候有没有这个问题呀?
dawangzi16 2004-08-21
  • 打赏
  • 举报
回复
access是单进程得吧,根据pv操作原理,你得严格控制好关闭和链接
zhushizu 2004-08-21
  • 打赏
  • 举报
回复
还有要看看你的数据源有没有设对,这个也很重要!
zhushizu 2004-08-21
  • 打赏
  • 举报
回复
是数据库连接的问题拉
"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="
你在driverName这里加上双引号就表示他是一个字符串了,怎么还可以在里边进行运算!
你可以先在ODBC里为数据源设一个名字,到时候再用jdbc:odbc桥后边直接加上就可以了!!
syd_barrett 2004-08-20
  • 打赏
  • 举报
回复
在rs.getRow();这句之前添加一句rs.next();
whoopee 2004-08-20
  • 打赏
  • 举报
回复
改过了,不好用,错误一样!
guestman 2004-08-20
  • 打赏
  • 举报
回复
这里改成如下:
String connStr = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=test.mdb";
whoopee 2004-08-20
  • 打赏
  • 举报
回复
lhzongji(踪迹)

我按你说的做了,改成
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(Exception e){
System.err.println(e);
}
这样了,编译是通过了,但是java后出现错误:
[Microsoft][ODBC 驱动程序 管理器] 未发现数据源名称并且未指定默认驱动程序

怎么回事?
lhzongji 2004-08-20
  • 打赏
  • 举报
回复
晕倒,我给你说过了。如果在类或者函数中就必须CATCH。这是JAVA的规范。当然编译错误了。

try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(Exception e){
System.err.println(e);
}
在这里你必须捕捉异常。否者根本就编译不过去。
whoopee 2004-08-20
  • 打赏
  • 举报
回复
lhzongji(踪迹)
看看我的源代码:
import java.sql.*;
import java.lang.*;
public class conn
{
public static void main(String[] args){
Connection con;

try{

String connStr = "jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)};dbq=test.mdb";
//try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//}
//catch(Exception e){
// System.err.println(e);
//}
//Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection(connStr);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from User");
//rs.last();
int intRowCount = rs.getRow();
System.out.println(intRowCount);
}
catch(SQLException e){
System.err.println(e.getMessage());
}

//stmt.close();
//con.close();
}
}
我觉得没有问题呀?
但是就是在class那里报错呀!
lhzongji 2004-08-20
  • 打赏
  • 举报
回复
据我感觉可能是旧版驱动不兼容新版驱动的写法

DRIVER这种写法已经很老套了。PROVIDER是嵌入式的快速连接,可我找不到怎么用PROVIDER啊。我想是连接的方式问题
lhzongji 2004-08-20
  • 打赏
  • 举报
回复
lianeng(★★★★★)

我想应该是,但我真不想是,如果是的话,我就绝望了。
lhzongji 2004-08-20
  • 打赏
  • 举报
回复
whoopee(帅得惊动了党)

must be caught or declared to be thrown

你是没有使用TRY语句。可能你是把这句话封装到函数或类里面了。

使用TRY语句catch ClassNotFoundException这个异常就可以了。你这是编译错误
加载更多回复(12)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧