我尝试根据特定条件搜索表格。 SQL查询在SQL Developer中执行时返回正确的结果(1行)。在JDBC中,结果集不为null,resultset.next()
返回false。
代码:
public static ArrayList<SearchRecord> searchRecords(Connection conn, int orderID) throws SQLException {
System.out.println("Order_id: " + orderID); //The correct orderID is passed
ArrayList<SearchRecord> searchResult = null;
SearchRecord searchRecord = null;
PreparedStatement search_pstm = null;
ResultSet search_rs = null;
if (conn != null) {
// This query is successfully executed in SQL Developer and outputs a row
String search_sql = "select d.PPS_NUM, a.BRC_ORD_ID, PROJECT_NUM, LICENSE_NUM, EXPIRY_DATE, FIRST_NAME, LAST_NAME, ADDRESS1, ADDRESS2, CITY, PROVINCE, POSTAL_CODE from VD_SHIP_AOR a, VD_BRC_ORD b, VD_CONSOL_VALID c, VD_SHIP d where a.brc_ord_id = b.brc_ord_id and b.CONSOL_VALID_ID= c.consol_valid_id and a.SHIP_ID = d.SHIP_ID and d.ORD_ID = b.ORD_ID and d.PPS_NUM = ?";
search_pstm = conn.prepareStatement(search_sql);
search_pstm.setInt(1, orderID);
search_rs = search_pstm.executeQuery();
searchResult = new ArrayList<SearchRecord>();
if (search_rs != null) {
System.out.println("Not null"); //Prints this
System.out.println(search_rs.isClosed()); //Prints false
System.out.println(search_rs.getRow()); //Prints 0
while (search_rs.next()) { //Does not enter the while loop, why?
System.out.println("Inside while rs.next");
//store resultset's data into arraylist
}
}
}
return searchResult;
}
我考虑的是:
Similar Stack Overflow question
但是现有的解决方案对我不起作用,请帮助我。
答案 0 :(得分:2)
如果没有行,您似乎假设此方法返回null
,情况并非如此。方法executeQuery()
永远不会返回null
* 。 API文档具体说:
返回:
包含查询生成的数据的ResultSet
对象; 从不null
因此,您的null
- 检查完全没必要。它将生成一个结果集(即使查询没有产生任何行),或者它会抛出一个SQLException
例如语法错误,或者如果执行的语句没有产生结果集(例如更新或删除)声明)。
执行后的结果集最初打开,并在之前第一行(如果有)。如果没有更多行,则对ResultSet.next()
的调用将返回false
。在这种情况下,您的select语句不会产生任何行是合理的,因此结果集为空,第一次调用next()
将返回false
。
我认为您对API的假设不正确。我建议您仔细阅读JDBC API文档,并阅读有关JDBC的一些教程或介绍性文本。
如果SQL Developer显示一行且您的代码没有,请仔细检查1)您是否真的使用相同的数据库,2)使用的ID是否真的相同,以及3)如果您正在查看的数据在SQL Developer中实际上已经提交了。并考虑首先简化您的查询,例如,仅从一个表中选择,删除此订单号上的特定条件,以便您选择所有行,使用您在SQL Developer中使用的相同文字值(在查询中硬编码),等等。您确定自己使用了正确的条件,PPS_NUM
看起来不像Order_id
,而例如ORD_ID
看起来更像是一个。{/ p>
*:忽略特定驱动程序实现中的错误的可能性