请教测试查询结果问题

lihuanmei 2010-06-23 09:31:11
现在写了两个类connDB.java和statementExp.java
其中connDB.java是用来连接数据库和关闭数据库连接的。这个类正确,已通过测试
statementExp.java是用来执行查询语句的。这个类有错误,在调试时,main函数中的rs 显示 BaseResultSet ,这是为什么啊,我不明白,还请高手指导,多谢!代码如下:



package com.phy.db;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.phy.db.connDB;


public class statementExp {

/*功能:执行查询语句*/
public ResultSet executeQuery(String sql) {
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
conn=connDB.getConnection();
try {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
}catch (SQLException ex) {//捕获异常
System.err.println(ex.getMessage());
}finally{//关闭结果集、数据库等连接
try{
if(rs != null)
rs.close();
System.out.println("rs close");
}catch(SQLException sqlex1){
System.err.println(sqlex1.getMessage());
}
try{
if(stmt != null)
stmt.close();
System.out.println("stmt close");
}catch(SQLException sqlex2){
System.err.println(sqlex2.getMessage());
}
}
connDB.closeConnection();
return rs;
}




public static void main(String[] args) {statementExp se=new statementExp();
String sql="select * from tb_gov";
ResultSet rs=null;
rs=se.executeQuery(sql);/////////////////???????????????????
try{
if(rs.next()){//对查询结果进行判断
System.out.println("查询成功");
}else{
System.out.println("查询失败");
}
}catch(Exception e){
System.out.println(e.getMessage());
}

}

}

在调试到红色这句时,进入executeQuery(String sql)函数里时,逐步调试,显示如下
变量名 变量值
conn SQLServerConnection
stmt BaseStatement
rs BaseResultSet
...全文
86 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
victor_woo 2010-06-23
  • 打赏
  • 举报
回复
放到网站的登录程序:

如果访问量不大,就每次执行标准的JDBC操作过程即可,不需要这么封装;

rs不需要保存,用完即关闭;

Connection可以长连,用application变量保存即可,不必每次获取connection又去关闭
lihuanmei 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ibm_hoojo 的回复:]
CSS code

建议写个数据库的操作静态类,在里面写获得链接,关闭链接等操作静态方法。其他的类直接使用静态方法
操作数据库就可以了。
你这样写太复杂了
[/Quote]

您好,能小小麻烦下您,帮忙写个样例吗,我不是很明白你说的呢,而且你说的确实有道理啊,这两个类在各自的测试环境中是正确的,但是放到网站的登录程序里一实验,那个statementExp.java里的close那两个函数还是错误的呢,麻烦您了,非常感谢!
hoojo 2010-06-23
  • 打赏
  • 举报
回复

建议写个数据库的操作静态类,在里面写获得链接,关闭链接等操作静态方法。其他的类直接使用静态方法
操作数据库就可以了。
你这样写太复杂了
lihuanmei 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 stl0 的回复:]
我建议最好不要用resultSet当作结果返回。

当生成 ResultSet 对象的 Statement 对象关闭、重新执行或用来从多个结果的序列检索下一个结果时,ResultSet 对象会自动关闭。

不如在rs生成之时,就加以判断,这样最不容易出错了。

Java code

try {
stmt = conn.createStatement(ResultSet.……
[/Quote]


多谢您指点,那就是说,在rs收到结果后,最稳妥的方法,是把它存到一个类似数组或list等中,是吧,我真的是非常非常菜,还请您多多指教,O(∩_∩)O谢谢
lihuanmei 2010-06-23
  • 打赏
  • 举报
回复
嗯,数据库连接时静态方法,已经连接成功,多谢您我已经改好了,谢谢各位指点
现把好用的代码贴出,供将来人学习
***********************************connDB.java*************************************
package com.phy.db; //包名请相应调整

import java.sql.*;
import java.io.*;
import java.util.*;

public class connDB {

private static final String DBDRIVE = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; //数据库驱动,请做相应调整
private static final String DBURL = "jdbc:microsoft:sqlserver://localhost:1433;DataBaseName=zfjs"; //数据库名,请做相应调整
private static final String USER = "sa"; //用户名,请做相应调整
private static final String PASSWORD = "1"; //密码,请做相应调整

public static Connection connection;

static{
try{
Class.forName(DBDRIVE).newInstance();
connection = DriverManager.getConnection(DBURL, USER, PASSWORD);

}catch(SQLException sqlex){
sqlex.printStackTrace();
}catch(Exception ex){
ex.printStackTrace();
}
}


/*数据库连接*/
public static Connection getConnection(){
return connection;
}

/*关闭数据库连接*/
public static void closeConnection(){
try{
if(connection != null)
connection.close();
System.out.println("connection.close()");
}catch(SQLException sqle1){
sqle1.printStackTrace();
}
}



/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn=null;
conn=connDB.getConnection();
if(conn==null){
System.out.println("数据库连接失败!");
}else{
System.out.println("数据库连接成功!");
try{
connDB.closeConnection();
System.out.println("数据库连接关闭成功");
}catch(Exception e){
System.out.println(e.getMessage());
}
}


}

}

******************************statementExp.java*********************************
package com.phy.db; //包名请相应调整

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.phy.db.connDB;


public class statementExp {

Connection conn=null;
Statement stmt=null;
ResultSet rs=null;

/*功能:执行查询语句*/
public ResultSet executeQuery(String sql) {
conn=connDB.getConnection();
try {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
}catch (SQLException ex) {
System.err.println(ex.getMessage());
}
return rs;
}




/*功能:执行更新操作*/
public int executeUpdate(String sql) {
int result = 0;
if(sql==null) sql="";
conn=connDB.getConnection();
try {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
result = stmt.executeUpdate(sql);
}catch (SQLException ex) {
result = 0;
System.err.println(ex.getMessage());
}
return result;
}


public void closeQuery(){
try{
if(rs != null)
rs.close();
System.out.println("rs close");
}catch(SQLException sqlex1){
System.err.println(sqlex1.getMessage());
}
try{
if(stmt != null)
stmt.close();
System.out.println("stmt close");
}catch(SQLException sqlex2){
System.err.println(sqlex2.getMessage());
}
connDB.closeConnection();
}

public void closeUpdate(){
try{
if(stmt != null)
stmt.close();
System.out.println("stmt close");
}catch(SQLException sqlex){
System.err.println(sqlex.getMessage());
}
connDB.closeConnection();
}




/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
statementExp se=new statementExp();
String sql="select * from tb_gov";
ResultSet rs=null;
rs=se.executeQuery(sql);

try{
if(rs.next()){
System.out.println("查询成功");
}else{
System.out.println("查询失败");
}
se.closeQuery();
}catch(Exception e){
System.out.println(e.getMessage());
}

}

}


stl0 2010-06-23
  • 打赏
  • 举报
回复
我建议最好不要用resultSet当作结果返回。

当生成 ResultSet 对象的 Statement 对象关闭、重新执行或用来从多个结果的序列检索下一个结果时,ResultSet 对象会自动关闭。

不如在rs生成之时,就加以判断,这样最不容易出错了。

try {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);

if(rs.next()){//对查询结果进行判断
System.out.println("查询成功");
}else{
System.out.println("查询失败");
}
}catch (SQLException ex) {//捕获异常
System.err.println(ex.getMessage());
}finally{//关闭结果集、数据库等连接
try{
if(rs != null)
rs.close();
System.out.println("rs close");
}catch(SQLException sqlex1){


zhoutaibo 2010-06-23
  • 打赏
  • 举报
回复
用conn=connDB.getConnection();初始化数据库连接成功了吗?你的getConnection()方法是静态方法吗?否则你怎么会用类名直接调用方法呢
lihuanmei 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 stl0 的回复:]
引用楼主 lihuanmei 的回复:
}finally{//关闭结果集、数据库等连接
try{
if(rs != null)
rs.close();
System.out.println("rs close");
}


你在finally中吧rs关闭了,而返回结果又是rs, 所以返回的rs应该为空吧
[/Quote]

(⊙o⊙)哦,确实是哦,之前不明白,那这个关闭rs的应该怎么写,或者说写在哪里呢,请教了
stl0 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 lihuanmei 的回复:]
}finally{//关闭结果集、数据库等连接
try{
if(rs != null)
rs.close();
System.out.println("rs close");
}
[/Quote]

你在finally中吧rs关闭了,而返回结果又是rs, 所以返回的rs应该为空吧
  • 打赏
  • 举报
回复
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
conn=connDB.getConnection();
try {
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
把这些都丢到main方法里测试下

81,094

社区成员

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

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