【问题标题】:resultset.next() is showing output of first row onlyresultset.next() 仅显示第一行的输出
【发布时间】:2023-04-01 07:41:02
【问题描述】:

所以,我有这样的事情:

System.out.println("Enter owner's IC no. or plate no. : ");
String update = in.nextLine();

String sql = String.format("SELECT * FROM `vehicle` WHERE ic='%s' OR plate ='%s'",update,update);

ResultSet rs = stmt.executeQuery(sql);

if(rs.next()) {
    System.out.println("RegNo." +"\t\t"+ "Name" + "\t\t" + "IC" +"\t\t" + "Plate No." + "\t" + "Color" + "\t\t" + "Year" + "\t\t" + "Make" + "\t\t" + "Model" +"\t\t"+ "Capacity" + "\t" + "Type" +"\t\t" + "Max Load");
}
else {
    System.out.println("IC and PLate No. not found....");}

while (rs.next()) {
    regno = rs.getInt("regno");
    name = rs.getString("name");
    ic = rs.getString("ic");
    plate = rs.getString("plate");
    color = rs.getString("color");
    year = rs.getInt("year");
    make = rs.getString("make");
    model = rs.getString("model");
    capacity = rs.getDouble("capacity");
    type = rs.getString("type");
    maxload = rs.getDouble("maxload");

    System.out.println(toString());
}   

我要做的是,如果在数据库中找到数据,它将打印下表以获取匹配的输出。

现在,它应该打印出每个输出。但是,它只打印出第一个。

我相信下面的代码是原因:

 if(rs.next()) {
    System.out.println("RegNo." +"\t\t"+ "Name" + "\t\t" + "IC" +"\t\t" + "Plate No." + "\t" + "Color" + "\t\t" + "Year" + "\t\t" + "Make" + "\t\t" + "Model" +"\t\t"+ "Capacity" + "\t" + "Type" +"\t\t" + "Max Load");
}
else {
    System.out.println("IC and PLate No. not found....");}

【问题讨论】:

  • 你的两个代码sn-ps有什么关系?一个人打电话给另一个人吗?
  • 他们的方法是一样的
  • 那么我们需要更多的上下文。您的while 循环应该将光标循环到整个结果集。而您的if 语句also 将光标向前移动一行。它们都修改了光标在ResultSet中的位置,所以我们需要知道完整的数据流是什么。您可以编辑您的帖子以包含足够的代码以供其他人复制您的问题吗?
  • 好的,我做了一些编辑
  • 所示代码将跳过第一行,而不是只显示第一行...此外,您的代码容易受到 SQL 注入:您应该 String.format 值到查询字符串中,你应该使用带参数的预处理语句。

标签: java mysql resultset


【解决方案1】:

使用MessageFormat 格式化输出,使用counter 确定结果集是否为空,如下所示:

String strFormat = "RegNo. {0}\tName {1}\tIC {2}\tPlate No. {3}\tColor {4}\tYear {5}\tMake {6}\tModel {7}\tCapacity {8}\tType {9}\tMax Load {10}");

int counter = 0;

while (rs.next()) {
    counter++;

    regno = rs.getInt("regno");
    name = rs.getString("name");
    ic = rs.getString("ic");
    plate = rs.getString("plate");
    color = rs.getString("color");
    year = rs.getInt("year");
    make = rs.getString("make");
    model = rs.getString("model");
    capacity = rs.getDouble("capacity");
    type = rs.getString("type");
    maxload = rs.getDouble("maxload");

    System.out.println(MessageFormat.format(strFormat, regno, name, ic, plate, color, year, make, model, capacity, type, maxload));
}

if (counter == 0) {
    System.out.println("IC and PLate No. not found....");
}

【讨论】:

  • 是的,这是一种替代方法。谢谢。
  • 但是输出有点乱,我这样用怎么对齐。
  • 请使用\t 用于制表符,\n 用于换行
  • @TaiShengHong 这不是“替代方法”。与您自己的代码不同,这是一种正确的方法。还有其他选择,但您的代码不是其中之一。
【解决方案2】:

所以我在这里看到了两个问题。最大的是这个:

System.out.println(toString());

这会调用当前类的.toString() 方法,该方法不会输出来自ResultSet 的任何数据。至少,不是基于您显示的任何代码。您将从ResultSet 返回的所有值存储在变量中,但这些变量似乎没有在任何地方使用。您需要以某种方式将这些变量传递给您的.println()

第二个问题是rs.next() 将光标向前移动了一行。所以当你这样做时:

if(rs.next()) {

这会导致您跳过第一行。这实际上有点难以解决,因为如果不调用.next(),就无法判断ResultSet 是否为空。我可能处理这个问题的方法是将所有结果拉入列表中的对象,然后根据列表而不是 ResultSet 本身进行所有打印。

【讨论】:

  • next() 的问题可以通过使用do .. while 而不是while inside if 分支来解决。无需拉取整个结果集即可避免这种情况。
  • @MarkRotteveel 啊,好电话。我已经习惯了使用ResultSetExtractor,以至于我什至没有想到更简单的解决方案!
【解决方案3】:

在使用带有 Prepared 语句的 select 查询时,我也遇到了同样的问题。 例如-

String sqlquerySELECTAgentsWithParam = " select * from AGENTS WHERE AGENT_CODE = ( ? ) ";

它返回了一行,因为我使用了 IF 条件,然后使用了 while(rs.next()) 我无法打印单行,因此,我使用了如下所示的 do-while 循环来打印第一行结果。下面的代码sn-p-希望对您有所帮助!

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(oracelDBUrl, oracleDBUser,oracleDBPwd );

if (conn != null) { System.out.println("Connected to the Oracle DB ");  }
else { System.out.println("Failed to Connect to Oracle DB "); }
PreparedStatement pstmt = conn.prepareStatement(sqlquerySELECTAgentsWithParam);
pstmt.setString(1,"<agent_id>");
ResultSet rs = pstmt.executeQuery();
boolean returnResultrs = rs.next();
System.out.println("Fetched Result is = " +returnResultrs);
if(returnResultrs)
{
    do {
        System.out.println("Inside Do - While Loop");
        System.out.println("AGENT_CODE = " + rs.getString(1)+ "has AGENT_NAME = "  +rs.getString(2));
        }
while(rs.next());

}

【讨论】:

    猜你喜欢
    • 2012-10-06
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2019-02-01
    相关资源
    最近更新 更多