我在网上参考了O'Reilly的有关jtable的代码,测试发现问题,不知道怎么解决,希望各位大大指点.java.sql.SQLException: No data found
  at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
  at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source)
  at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source)
  at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
  at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source)
  at Test.main(Test.java:66)这是测试的元代码抓取的部分import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.ArrayList;
 
public class Test {
 
  /**
   * @param args
   */
  public static void main(String[] args) {
 
    try {
 
      Connection conn = DBConnector.getAccessConnection(null, null, "", "");
      DatabaseMetaData meta = conn.getMetaData();
      System.out.println("got meta = " + meta);
      ResultSet results = meta.getColumns(null, null, "t_user", null);
      System.out.println("got column results");
      ArrayList colNamesList = new ArrayList();
      ArrayList colClassesList = new ArrayList();
      while (results.next()) {
        colNamesList.add(results.getString("COLUMN_NAME"));
        System.out.println("name: " + results.getString("COLUMN_NAME"));
        int dbType = results.getInt("DATA_TYPE");
        switch (dbType) {
        case Types.INTEGER:
          colClassesList.add(Integer.class);
          break;
        case Types.FLOAT:
          colClassesList.add(Float.class);
          break;
        case Types.DOUBLE:
        case Types.REAL:
          colClassesList.add(Double.class);
          break;
        case Types.DATE:
        case Types.TIME:
        case Types.TIMESTAMP:
          colClassesList.add(java.sql.Date.class);
          break;
        default:
          colClassesList.add(String.class);
          break;
        }
        ;
        System.out.println("type: " + results.getInt("DATA_TYPE"));
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
 
  }
 
}
这是连接Access的DBConnector类import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
/**
* 连接各类数据库的方法
*/
public class DBConnector {
    
  /**
   * 获得Access数据库的连接,当前是无DNS的连接方式
   * @param driverClassName   连接数据库用到的驱动类的类名
   * @param dbURL        连接数据库的URL
   * @param userName      登陆数据库的用户名
   * @param password      登陆数据库的密码
   * @return
   * @throws ClassNotFoundException   数据库驱动类无法找到是抛出该异常
   * @throws SQLException        创建连接时可能抛出该异常
   */
  public static Connection getAccessConnection(String driverClassName,
      String dbURL, String userName, String password)throws ClassNotFoundException,
      SQLException {
    if(driverClassName == null){
      driverClassName = "sun.jdbc.odbc.JdbcOdbcDriver";
    }
    if(dbURL == null){
      dbURL = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=database/seie.mdb";
    }
    return getConnection(driverClassName,dbURL,userName,password);
  }

解决方案 »

  1.   

    感觉就是没有找到你的的seie.mdb文件.
    你把seie.mdb这个文件拷贝到你的项目的根目录,然后不要database/试试.
    dbURL = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=seie.mdb"; 
      

  2.   

    Test.java:66
    这行的代码是什么?
    (现在初步怀疑你的数据库有Null值)
      

  3.   

    我刚才又帮你查了一些文档.发祥每一个列在一行上只能读一次, 读多次就会报错.
    你代码中:
     colNamesList.add(results.getString("COLUMN_NAME")); 
     System.out.println("name: " + results.getString("COLUMN_NAME")); 
    虽然你想是调试看看,但是违反了规则.
    你应该把得到的字符串放到一个变量中,然后再看它的值.
      

  4.   

    我刚才又帮你查了一些文档.发祥每一个列在一行上只能读一次, 读多次就会报错.
    你代码中:
     colNamesList.add(results.getString("COLUMN_NAME")); 
     System.out.println("name: " + results.getString("COLUMN_NAME")); 
    虽然你想是调试看看,但是违反了规则.
    你应该把得到的字符串放到一个变量中,然后再看它的值.
      

  5.   

    非常感谢mayuanfei[乌云和雨]的回复! 您在测试时可有结果?很想和您交流下! 有QQ或MSN吗?
      

  6.   

    呵呵.不用客气.MSN:[email protected]