概述:尝试连接到MS Access DB以将结果集返回到jtable。
问题:java空指针异常
代码:
package sundata;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Database {
public String strMIGID;
public String strEBID;
public String strSUN;
public String[][] objIDList;
//CONNECTION INFO
private Connection con;
private String strDBCon="jdbc:ucanaccess://C:/Users/Luke/Documents/MainDB.mdb";
public String strEXMessage;
public int CreateConnection(){
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection(strDBCon);
return 1;
}catch(Exception ex){
ex.printStackTrace();
strEXMessage=ex.getMessage();
return 2;
}
}
public int CloseConnection(){
try{
con.close();
return 1;
}catch(Exception ex){
ex.printStackTrace();
strEXMessage=ex.getMessage();
return 2;
}
}
public int GetMIGIDRecord(String strMIGIDRef){
try{
System.out.println("Connecting to database using MIGID");
String strSQLString = "Select * from tblSuppliersData where Supplier1 = ?";
PreparedStatement preStatement = con.prepareStatement(strSQLString, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
//SETTING FIRST CONDITION OF PREPARED STATEMENT IE ?
preStatement.setString(1, strMIGIDRef);
//EXECUTE QUERY
preStatement.executeQuery();
//RETURNS QUERY RESULTS INTO RESULT SET
ResultSet rs = preStatement.getResultSet();
//CHECK TO MAKE SURE SOME RECORDS ARE RETURNED
rs.last();
//IF CHECKS TO MAKE SURE RECORDS
if(rs.getRow()==0){
rs.close();
preStatement.close();
return 3;
}
//RECORDS NUMBER OF RECORDS
int iNoRecords = rs.getRow();
//CREATING 2D ARRAY WITH NO RECORDS (ROWS) AND TWO COLUMNS
String strTempdata[][] = new String [iNoRecords][3];
//MOVES BACK TO BEFORE FIRST RECORD
rs.beforeFirst();
//TRANSPOSES RS IN TO ARRAY
int i = 0;
while (rs.next()){
strTempdata[i][0]= rs.getString("MIGID");
strTempdata[i][1]= rs.getString("EBID");
strTempdata[i][2]= rs.getString("SUN");
i++;
}
objIDList = strTempdata;
//CLOSES CONNECTIONS
rs.close();
preStatement.close();
System.out.println("Connection complete");
return 1;
}catch(Exception ex){
ex.printStackTrace();
strEXMessage=ex.getMessage();
return 2;
}
}
我有一个获取strMIGIDREF的表单,我可以根据需要粘贴代码,但我认为这不是问题所在。
这是我遇到的错误,我已经粘贴了第一位,如果需要可以粘贴更多。
Connecting to database using MIGID
java.lang.NullPointerException
at sundata.Database.GetMIGIDRecord(Database.java:63)
at sundata.MainForm.MIGIDSearch(MainForm.java:141)
at sundata.MainForm.jmenuMIGIDSearchActionPerformed(MainForm.java:337)
at sundata.MainForm.access$000(MainForm.java:6)
at sundata.MainForm$1.actionPerformed(MainForm.java:58)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
第63行
//CHECK TO MAKE SURE SOME RECORDS ARE RETURNED
rs.last();
我已经尝试了一些我在Google上找到的解决方案,但目前还没有任何乐趣。我已经尝试了一些代码来检查连接等等,这似乎工作得很好,就在我尝试使用预备语句时,它似乎是一个错过。 ResultSet rs = preStatement.getResultSet();只是一直说它的值为null,getMaxRows也是如此。
我正在使用Netbeans IDE 7.4和JAVA SE SDK 7
答案 0 :(得分:3)
您收到NullPointerException
,因为您使用了executeQuery
方法:
//EXECUTE QUERY
preStatement.executeQuery();
//RETURNS QUERY RESULTS INTO RESULT SET
ResultSet rs = preStatement.getResultSet();
第一行代码执行SQL查询并返回一个ResultSet对象,您只需将其丢弃(因为您不将其分配给任何内容)。第二行代码尝试检索PreparedStatement的ResultSet,但它已被前一行检索(并丢弃),因此getResultSet
返回null
。
相反,你应该只做
ResultSet rs = preStatement.executeQuery();
附加说明:
省略Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
语句,因为(1)这是无关紧要的:UCanAccess不使用ODBC,而(2) {{1}几乎不再需要语句(UCanAccess根本不需要)。
不要使用Class.forName
来测试是否返回了行。相反,只需在返回ResultSet后立即调用rs.last()
。如果rs.next()
返回rs.next()
,则ResultSet包含行(现在您指向第一行)。如果true
返回rs.next()
,则不会返回任何行。 false
后跟rs.last()
将无法正常使用默认的ResultSet类型,即rs.beforeFirst()
。