我在网上参考了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);
}
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);
}
你把seie.mdb这个文件拷贝到你的项目的根目录,然后不要database/试试.
dbURL = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=seie.mdb";
这行的代码是什么?
(现在初步怀疑你的数据库有Null值)
你代码中:
colNamesList.add(results.getString("COLUMN_NAME"));
System.out.println("name: " + results.getString("COLUMN_NAME"));
虽然你想是调试看看,但是违反了规则.
你应该把得到的字符串放到一个变量中,然后再看它的值.
你代码中:
colNamesList.add(results.getString("COLUMN_NAME"));
System.out.println("name: " + results.getString("COLUMN_NAME"));
虽然你想是调试看看,但是违反了规则.
你应该把得到的字符串放到一个变量中,然后再看它的值.