现在写了两个类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

解决方案 »

  1.   

     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方法里测试下
      

  2.   


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

  3.   


    (⊙o⊙)哦,确实是哦,之前不明白,那这个关闭rs的应该怎么写,或者说写在哪里呢,请教了
      

  4.   

    用conn=connDB.getConnection();初始化数据库连接成功了吗?你的getConnection()方法是静态方法吗?否则你怎么会用类名直接调用方法呢
      

  5.   

    我建议最好不要用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){
      

  6.   

    嗯,数据库连接时静态方法,已经连接成功,多谢您我已经改好了,谢谢各位指点
    现把好用的代码贴出,供将来人学习
    ***********************************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());
    }
           
    }}
      

  7.   

    多谢您指点,那就是说,在rs收到结果后,最稳妥的方法,是把它存到一个类似数组或list等中,是吧,我真的是非常非常菜,还请您多多指教,O(∩_∩)O谢谢
      

  8.   


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

  9.   

    放到网站的登录程序:如果访问量不大,就每次执行标准的JDBC操作过程即可,不需要这么封装;rs不需要保存,用完即关闭;Connection可以长连,用application变量保存即可,不必每次获取connection又去关闭