预处理语句和结果集 - Java空指针异常

时间:2014-05-22 17:40:08

标签: java jdbc nullpointerexception ucanaccess

概述:尝试连接到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

1 个答案:

答案 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();

附加说明:

  1. 省略Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");语句,因为(1)这是无关紧要的:UCanAccess不使用ODBC,而(2) {{1}几乎不再需要语句(UCanAccess根本不需要)。

  2. 不要使用Class.forName来测试是否返回了行。相反,只需在返回ResultSet后立即调用rs.last()。如果rs.next()返回rs.next(),则ResultSet包含行(现在您指向第一行)。如果true返回rs.next(),则不会返回任何行。 false后跟rs.last()将无法正常使用默认的ResultSet类型,即rs.beforeFirst()