【问题标题】:Can't print information from SQL in Java无法从 Java 中的 SQL 打印信息
【发布时间】:2017-05-11 19:30:22
【问题描述】:

用户必须从显示的表格中选择一个度假村 ID 并进行预订。我似乎找不到我的问题,我想打印他们预订的度假村的名称。

String x = jTextFieldID.getText();
    Integer Resort = Integer.valueOf(x);
    int resort = Integer.parseInt(x);
    String sql = "SELECT RESORT_NAME FROM LouwDataBase.Resorts WHERE ID = "+Resort;  
        try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setInt(1, resort);
                try (ResultSet rs = pstmt.executeQuery()) {
                    if (rs.next()) {
                    String resortName = rs.getString("RESORT_NAME");
                    JOptionPane.showMessageDialog(null,
                    "You want to book at " + resortName);
    }

【问题讨论】:

  • 您遇到错误了吗?如果是这样,它是什么?问题可能是您没有正确格式化表引用。格式为database.schema.table。也许尝试使用 LouwDatabase.dbo.Resorts (或实际模式,如果不同的话)。
  • 2017 年 5 月 11 日晚上 9:36:37 it.pat.Booking jButton1ActionPerformed SEVERE: null java.sql.SQLException: Method 'executeQuery(String)' not allowed on Prepared statement。在 org.apache.derby.client.am.SQLExceptionFactory.getSQLException(Unknown Source) 在 org.apache.derby.client.am.SqlException.getSQLException(Unknown Source) 在 org.apache.derby.client.am.ClientPreparedStatement.executeQuery (来源不明)
  • 错误信息很清楚:改用pstmt.executeQuery(),不带字符串参数。
  • 你应该用问题来定位错误堆栈。

标签: java sql jdbc resultset


【解决方案1】:

你必须使用rs.next()

ResultSet rs = pstmt.executeQuery(sql);
String resortName = "";
if(rs.next()){//<<-----------------------------
  resortName = rs.getString("RESORT_NAME");
}

JOptionPane.showMessageDialog(null, "You want to book at "+resortName);

如果您想获得更多结果,可以改用while(rs.next){...}


注意?一个好的做法是,不要在变量名的开头使用大写字母ResortName,而是使用 resortName

【讨论】:

  • 这是rs.next() 而不是rs.next,修正错字:)
  • 对不起,我尝试使用 rs.next,但得到了同样的错误。无论如何感谢您的帮助。
  • @Swiper 我的错误尝试用括号代替 rs.next()
  • @Swiper 你用的是什么DBMS?
  • 我在 NetBeans 中使用 JavaDB。
【解决方案2】:

您需要在尝试读取 ResultSet 结果之前对其进行测试:

if(rs.next()) {
    String ResortName = rs.getString(1);
    JOptionPane.showMessageDialog(null, "You want to book at "+ResortName);
}

您可以使用getString(1) 获取RESORT_NAME,查看ResultSet .getString(int index) method 了解更多详情。

【讨论】:

  • 刚试了一下,觉得不需要循环,只想显示用户输入的ID的Resort Name
  • @Swiper 我在哪里提到loop 在我的回答中?我不明白。
  • 对不起,我的意思是下一个()
  • 是的,如果没有来自 DB 的匹配结果,测试只是为了避免得到 NullPointerException
  • @Swiper rs.next(),它将光标移动到数据库中结果集的下一行,如果有任何行则返回true,否则返回false必须使用rs.next() 在此处阅读此答案stackoverflow.com/a/8199458/5558072
【解决方案3】:

错误是sql 也被传递给Statement.executeQuery(String),而不是PreparedStatement.executeQuery()

int resort = Integer.parseInt(x);
//String sql = "SELECT RESORT_NAME FROM LouwDataBase.Resorts WHERE ID = ?";  
String sql = "SELECT RESORT_NAME FROM LouwDataBase.Resorts WHERE ID = " + resort;  
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
    //pstmt.setInt(1, resort);
    try (ResultSet rs = pstmt.executeQuery()) {
        if (rs.next()) {
            String resortName = rs.getString("RESORT_NAME");
            JOptionPane.showMessageDialog(null,
                "You want to book at " + resortName);
        }
    }
} catch (SQLException ex) {
    Logger.getLogger(Booking.class.getName()).log(Level.SEVERE, null, ex);
}

Commented 是准备好的语句的替代用法(通常使用)。

你还应该关闭语句和结果集,这可以通过上面的 try-with-resources 自动完成。

哦,几乎监督,必须调用rs.next()(其他已经提到过。)

【讨论】:

  • java.sql.SQLException:列位置“1”超出范围。此 ResultSet 的列数为“0”。
  • 我将 WHERE ID = ?" 更改为 WHERE ID = "+Resort 并在上面遇到此错误
  • @Swiper 如果你不分享你的更新,我们帮不了你,所以请分享你的代码
  • 占位符 ?setInt(1,...) 或者没有 setInt。准备好的语句旨在与占位符一起使用,xkcd.com/327
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多