gpt4 book ai didi

java - 准备好的语句和结果集 - Java 空指针异常

转载 作者:行者123 更新时间:2023-12-01 22:57:30 27 4
gpt4 key购买 nike

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

最佳答案

您将获得 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) Class.forName几乎不再需要任何语句(并且 UCanAccess 根本不需要任何语句)。

  2. 不要使用rs.last()测试是否返回行。相反,只需调用 rs.next()返回 ResultSet 后立即执行。如果rs.next()返回true那么 ResultSet 包含行(并且您现在指向第一行)。如果rs.next()返回false然后没有返回任何行。 rs.last()接下来是 rs.beforeFirst()无法与默认 ResultSet 类型正常工作,即 ResultSet.TYPE_FORWARD_ONLY .

关于java - 准备好的语句和结果集 - Java 空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23813753/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com