JDBC返回空结果集,但记录存在于数据库中

时间:2016-06-06 03:05:45

标签: java jdbc oracle10g

public class alldata {

public static void main(String arg[])
{

    String str;
    try
    {
       Class.forName("oracle.jdbc.driver.OracleDriver");

         Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","system","root");
           PreparedStatement stmt2;

         String sql="select * from RECORDDATA where ID= ? and COMPANY_NM= ?";
        stmt2=con.prepareStatement(sql);
         int i=5;
        str="Audi";
         try
         {

             stmt2.setInt(1, i);
             System.out.println("after setting id");
             stmt2.setString(2,str);
             System.out.println("after setting string");
         }
         catch(Exception iner)
         {
             System.out.println("int coulnm"+iner);
         }
        try
        { 

         ResultSet showdata=stmt2.executeQuery();
         System.out.println("after rs");


            while(showdata.next())
         {

             System.out.println("in next");
             System.out.println("\n"+showdata.getInt(1)+showdata.getString(2)+showdata.getString(3)+showdata.getString(4)+showdata.getString(5)+showdata.getString(6)+showdata.getString(7));
             System.out.println("after next");
         }
    }catch(Exception e)
    {
        e.printStackTrace();
    }
}catch(Exception e2)
{
    e2.printStackTrace();
}

}
}

如果我使用硬编码值ID = 5和COMPANY_NM =奥迪它会从数据库中检索3条记录...但是我的程序会动态地从用户接受这些值...所以这不起作用....请帮助...我陷入了这个阶段...... showdata.next() method没有执行..虽然数据库中有3条记录。

2 个答案:

答案 0 :(得分:1)

如果您希望返回多个记录,为什么我的代码中找不到循环来迭代这些记录?

此外,next()将检索下一个记录。调用它两次意味着您正在查看第二个检索到的记录。

现在换其他东西:

  • Java命名约定是类名必须以大写字母开头。

  • 您不需要Class.forName("oracle.jdbc.driver.OracleDriver")。对于与Java 6或更高版本兼容的JDBC驱动程序,不需要这样做。

  • 删除所有try-catch语句。您正在捕获错误,然后让代码继续运行,就好像没有错。 不要这样做!

  • 您没有释放资源。使用try-with-resources可以更好地管理资源。它的使用也更简单。

class Alldata {
    public static void main(String arg[]) throws SQLException {
        int id = 5;
        String name = "Audi";

        try (Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "system", "root")) {
            String sql = "select * from RECORDDATA where ID= ? and COMPANY_NM= ?";
            try (PreparedStatement stmt = con.prepareStatement(sql)) {
                stmt.setInt(1, id);
                stmt.setString(2, name);
                try (ResultSet rs = stmt.executeQuery()) {
                    while (rs.next()) {
                        System.out.printf("\n%d, %s, %s, %s, %s, %s, %s%n", rs.getInt(1),
                                          rs.getString(2), rs.getString(3), rs.getString(4),
                                          rs.getString(5), rs.getString(6), rs.getString(7));
                    }
                }
            }
        }
    }
}

请注意,您使用的是system架构。您不应该在系统架构中创建用户表。

用户system应仅用于数据库维护,例如创建新用户。它永远不应该被应用程序使用。

<强>更新

从评论中可以看出,该语句在硬编码时有效,但在使用?标记时则无效。为了确保我做对了,请尝试以下代码:

class Alldata {
    public static void main(String arg[]) throws SQLException {
        try (Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "system", "root")) {
            String sql1 = "select count(*) from RECORDDATA where ID= ? and COMPANY_NM= ?";
            try (PreparedStatement stmt = con.prepareStatement(sql1)) {
                stmt.setInt(1, 5);
                stmt.setString(2, "Audi");
                try (ResultSet rs = stmt.executeQuery()) {
                    if (rs.next())
                        System.out.println("Count 1: " + rs.getInt(1));
                }
            }
            String sql2 = "select count(*) from RECORDDATA where ID= 5 and COMPANY_NM= 'Audi'";
            try (PreparedStatement stmt = con.prepareStatement(sql2)) {
                try (ResultSet rs = stmt.executeQuery()) {
                    if (rs.next())
                        System.out.println("Count 2: " + rs.getInt(1));
                }
            }
        }
    }
}

它应该打印相同的数字&#34; Count 1&#34;和&#34;计数2&#34;。

答案 1 :(得分:0)

System.out.println(showdata.next());检索了您的第一条记录。

每次调用.next()都会向前推动指针。因此,如果您之后没有直接使用检索到的结果,请阻止调用.next()