Java ResultSet 为空,但实际上它不应该是
Posted
技术标签:
【中文标题】Java ResultSet 为空,但实际上它不应该是【英文标题】:Java ResultSet empty but actually it shouldn't be 【发布时间】:2015-09-17 09:13:08 【问题描述】:我正在尝试打印 ResultSet,但它不打印任何内容。有人可以告诉我有什么问题吗? 我正在使用 Oracle 11g、JDK 1.7 和 ojdbc6.jar。 提前致谢。 我执行的代码如下。
import java.sql.*;
public class database
public static void main( String args[])
System.out.println("---Connecting to Oracle---");
try
Class.forName("oracle.jdbc.driver.OracleDriver");
catch( ClassNotFoundException e)
System.out.println( e );
System.out.println("---JDBC Registered---");
String URL = "jdbc:oracle:thin:admin/nihtij34@localhost:1521:XE";
String user = "admin";
String pwd = "nihtij34";
try
Connection con = DriverManager.getConnection(URL,user,pwd);
Statement s = con.createStatement();
s.executeQuery ("select * from seat where doj= '1-01-2016' ");
System.out.println("---QUERY EXECUTED---");
ResultSet rs1 = s.getResultSet();
while(rs1.next())
System.out.println( rs1.getString("tno"));
System.out.println( rs1.getString("doj"));
System.out.println( rs1.getString("sl"));
System.out.println( rs1.getString("ac3"));
System.out.println( rs1.getString("ac2"));
s.close();
con.close();
catch(SQLException e)
System.out.println(" NOT CONNECTED\n"+e);
我得到的输出如下:
---Connecting to Oracle---
---JDBC Registered---
---QUERY EXECUTED---
我在Oracle中尝试了查询,它返回了以下结果。
SQL> select * from seat where doj='1-01-2016';
TNO DOJ SL AC3 AC2
---------- ---------- ---------- ---------- ----------
11042 1-01-2016 10 10 10
12163 1-01-2016 10 10 10
12321 1-01-2016 10 10 10
12322 1-01-2016 10 10 10
12323 1-01-2016 10 10 10
12324 1-01-2016 10 10 10
12615 1-01-2016 10 10 10
12616 1-01-2016 10 10 10
12841 1-01-2016 10 10 10
12842 1-01-2016 10 10 10
12951 1-01-2016 10 10 10
TNO DOJ SL AC3 AC2
---------- ---------- ---------- ---------- ----------
12952 1-01-2016 10 10 10
12 rows selected.
谁能告诉我是什么问题? 提前致谢。
【问题讨论】:
如果你尝试 select * from seat where doj= '1-01-2016' ? 你确定两者都使用相同的数据库? @UweAllner 是的,我对两者都使用相同的数据库。反复检查了好几遍。 @jarlh sql 查询返回相同的输出。更新了输出。 您是否尝试过使用to_date
格式化您的日期输入。它如何知道您选择了哪种格式的日期作为输入?
【参考方案1】:
s.executeQuery
行已经返回一个 ResultSet,您应该使用它,而不是随后调用 s.getResultSet()
。这里的JavaDoc 也表示第二次调用将返回null。我很惊讶您在 rs1.next()
上没有收到 NullPointerException。
另外,顺便说一句,将 Connection 和 Statement 变量移到 try-catch 块之外并在 finally
块中关闭它们,或使用 Java 7 try-with-resources 通常是一个好习惯建设。
【讨论】:
试过这个。没用。得到相同的输出。ResultSet rs1 = s.executeQuery ("select * from seat where doj= '1-01-2016' ");
我同意,他们丢失了原始 rs,我的额外说明:由于语言环境,使用字符串参数查询 DATE 列的便携性很差【参考方案2】:
能否先从resultSet中提取数据到变量中,然后再输出变量?
例如:
String variable1 = rs1.getString("tno1")
......................................
String variable5 = rs1.getString("ac2")
System.out.println(variable1);
......................................
System.out.println(variable5);
【讨论】:
这有什么帮助,你能解释一下吗? 这将逐项提取(逐行)将它们放入变量中,然后显示它们。如果我正确理解您的问题,我认为这将起作用。但是,这只适用于少数项目。否则,您可以选择 * 显示所有项目。 通过rs.getString("colName")
本身创建一个隐式引用。所以将它分配给一个新的字符串变量应该没有任何区别。因为他正在有效地做同样的事情。但是您不必要地创建了如此多的字符串引用。除了你的代码不会提供任何帮助,它甚至会降低性能以上是关于Java ResultSet 为空,但实际上它不应该是的主要内容,如果未能解决你的问题,请参考以下文章
ResultSet 不为空,但 resultset.next() 返回 false
如何在 Java 中查找 ResultSet 是不是为空? [复制]
当 RecyclerView 为空时,CollapsingToolbarLayout 不应折叠
Mysql Java Derby Netbeans:不允许“deleteRow”,因为 ResultSet 不是可更新的 ResultSet