【问题标题】:Error in combobox: java.sql.SQLException: Invalid cursor state - no current row组合框中的错误:java.sql.SQLException:游标状态无效 - 没有当前行
【发布时间】:2017-05-12 17:52:58
【问题描述】:

我不断收到此错误。

我有一个包含数据库元素的组合框,我希望它使所选选项出现在文本框中,但出现此错误。它仅适用于第一个结果:

代码如下:

private void cmbx_vendActionPerformed(java.awt.event.ActionEvent evt) {                                          
    // TODO add your handling code here:
   try{
      String url = "jdbc:informix-sqli://192.168.2.3:1525/cubo:INFORMIXSERVER=myserver;user=infx;password=infx";
    Connection con1 = DriverManager.getConnection(url);  
    System.out.println("Cubo conectada combobox");
    Statement st1= con1.createStatement();
    ResultSet rs1=st1.executeQuery("SELECT * FROM cartsusc WHERE vendedor = '"+this.cmbx_vend.getSelectedItem()+"'");
    rs1.next();
    this.txt_dato.setText(rs1.getString("vendedor"));

    }
    catch(Exception e){
        JOptionPane.showMessageDialog(null, e);
    }
}

【问题讨论】:

  • 您的查询没有返回任何行.. 您应该检查rs1.next() 是否为真.. 然后只提取值。
  • 怎么样?你能解释一下吗?

标签: java sql jdbc combobox informix


【解决方案1】:

检查ResultSet#next() 以查看是否确实有可用的行。

另外,请始终使用 PreparedStatement。它们有助于降低 SQL 注入攻击的风险。

通常的成语是:

try {
    Connection conn = getConnection();
    try {
        String sql = "SELECT * FROM cartsusc WHERE vendedor = ?";
        PreparedStatement ps = conn.prepareStatement(sql);
        try {
            ps.setString(1, this.cmbx_vend.getSelectedItem());
            ResultSet rs = ps.executeQuery();
            try {
                if (rs.next()) {
                    this.txt_dato.setText(rs1.getString("vendedor"));
                }
            } finally {
                rs.close();
            }
        } finally {
            ps.close();
        }
    } finally {
        conn.close();
    }
} catch (SQLException e) {
    //handle
}

从 Java 7 开始,您可以使用 try-with-resources 自动关闭资源:

String sql = "SELECT * FROM cartsusc WHERE vendedor = ?";
try (
    Connection conn = getConnection();
    PreparedStatement ps = conn.prepareStatement(sql);
    ) {
    ps.setString(1, this.cmbx_vend.getSelectedItem());
    try (ResultSet rs = ps.executeQuery()) {
        if (rs.next()) {
            this.txt_dato.setText(rs1.getString("vendedor"));
        }
    }
} catch (SQLException e) {
    //handle
}

【讨论】:

    【解决方案2】:

    你必须使用:

    if(rs1.next()){
        this.txt_dato.setText(rs1.getString("vendedor"));
    }
    

    不要这样设置参数,这会导致语法错误或 SQL 注入,而你必须使用 PreparedStatement 例如:

    String query = "SELECT * FROM cartsusc WHERE vendedor = ?";
    try (PreparedStatement pstm = connection.prepareStatement(query)) {
    
        pstm.setString(1, this.cmbx_vend.getSelectedItem());
        ResultSet rs1 = pstm.executeQuery();
        if(rs1.next()){
           this.txt_dato.setText(rs1.getString("vendedor"));
           //this.txt_dato.setText(rs1.getString(1));//or you can get your result like this
        }
    }
    

    完成后不要忘记关闭语句和连接。

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多