【问题标题】:resultset in jdbc is returning truejdbc 中的结果集返回 true
【发布时间】:2016-08-31 08:21:54
【问题描述】:

我编写了以下代码,即使没有结果,结果集(此处标记为 rs3)也返回 true。我想检查是否没有结果,然后用户必须再次输入正确的手机制造商。唐不知道我哪里出错了?

 BufferedReader r2 = new BufferedReader(new InputStreamReader(System.in)); 
 String phone_manufacturer="";
 boolean value1=true;
 while (value1) {
    System.out.println("\nPlease select your choice of phone manufacturer " );
    String line = r2.readLine();
    if (line.matches("[A-Za-z ]+$")) {
        phone_manufacturer = line;
        final String sql3 = "SELECT * from phone_model WHERE phone_type = '"+phone_type_choice+"' and manufacturer ='"+phone_manufacturer+"'";
        st3 = connection.createStatement();
        rs3= st3.executeQuery(sql3);
        if(rs3!=null){
              System.out.println("Model"+"      "+"Manufacturer"+""+"Phone_type");
             while(rs3.next()){
                String modell  = rs3.getString("Model");
                String manufacturer = rs3.getString("Manufacturer");
                String phone_type = rs3.getString("Phone_type");
          System.out.format("%-25s%-20s%-10s\n",modell,manufacturer,phone_type);
            }
         }

         else
          {
       System.out.println("The manufacturer isn't avaiable for the phone type choosen.Please try again");
           value1=true;
           continue;
             }

     value1=false;
        }else
           {
           System.out.println("\nPlease enter correct manufacturer name " );
                            value1=true;
                            continue;

                          }
                          break;
                          }

【问题讨论】:

  • 你应该这样检查 if (!resultSet.isBeforeFirst() ) { System.out.println("No data"); }
  • executeQuery 总是返回一个结果集,即使它是空的。
  • 你是说 rs3.next() 返回 true 吗?顺便说一句,您这里的代码容易受到 SQL 注入的影响,所以我希望这只是一个示例。 IE.,有人输入phone_type="1; DROP TABLE phone_model; --"
  • 这个post 可以帮助你。
  • 我认为您需要将 if (rs3 != null) 更改为 if (!rs3.isAfterLast())

标签: java sql jdbc


【解决方案1】:

使用:

if (!rs3.next() ) {
    System.out.println("no data");
}

最初ResultSet的游标指向第一行之前,如果第一次调用next()返回false,则ResultSet中没有数据。

如果您正在使用新返回的 ResultSet,其光标指向第一行之前,更简单的检查方法是调用 isBeforeFirst()。

if (!rs3.isBeforeFirst() ) {    
 System.out.println("No data"); 
} 

最好使用prepared statment来避免sql注入:

 PreparedStatement updateemp = connnection.prepareStatement
      ("SELECT * from phone_model WHERE phone_type =? and manufacturer=?");
      updateemp.setString(1,phone_type_choice);
      updateemp.setString(2, phone_manufacturer);

How To use prepared statement.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多