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

ResultSet 为空,尽管 sql 查询正常但事件

如何在 Java 中查找 ResultSet 是不是为空? [复制]

当 RecyclerView 为空时,CollapsingToolbarLayout 不应折叠

MPI_Recv 覆盖它不应访问的部分内存

Mysql Java Derby Netbeans:不允许“deleteRow”,因为 ResultSet 不是可更新的 ResultSet