繁体   English   中英

java.sql.SQLException:无效的游标状态:标识符游标未位于UPDATE,DELETE,SET或GET语句中的行上; ResultSet为空

[英]java.sql.SQLException: invalid cursor state: identifier cursor not positioned on row in UPDATE, DELETE, SET, or GET statement: ; ResultSet is empty

我需要帮助来解决与使用HSQLDB从数据库提取数据有关的问题。 我得到错误:

java.sql.SQLException: invalid cursor state: identifier cursor not positioned on row in UPDATE, DELETE, SET, or GET statement: ; ResultSet is empty
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCResultSet.getCurrent(Unknown Source)
    at org.hsqldb.jdbc.JDBCResultSet.getColumnInType(Unknown Source)
    at org.hsqldb.jdbc.JDBCResultSet.getString(Unknown Source)
    at org.hsqldb.jdbc.JDBCResultSet.getString(Unknown Source)
    at DBactionSearch.actionPerformed(DBactionSearch.java:109)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: org.hsqldb.HsqlException: invalid cursor state: identifier cursor not positioned on row in UPDATE, DELETE, SET, or GET statement: ; ResultSet is empty
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.error.Error.error(Unknown Source)
    ... 42 more

代码有问题的部分是: text1 = rs.getString("firstname");

当我使用简单的SQL表达式(例如SELECT firstname, middlename, lastname, emailaddress, phonenumber FROM MY_TABLE时,一切正常,但是当我通过在部分WHERE (SELECT firstname, middlename, lastname, emailaddress, phonenumber FROM MY_TABLE WHERE '" + columnName + "' = '" + search + "'; ")添加变量WHERE (SELECT firstname, middlename, lastname, emailaddress, phonenumber FROM MY_TABLE WHERE '" + columnName + "' = '" + search + "'; ")使其SELECT firstname, middlename, lastname, emailaddress, phonenumber FROM MY_TABLE而变得更加复杂)时,出现前面提到的WHERE (SELECT firstname, middlename, lastname, emailaddress, phonenumber FROM MY_TABLE WHERE '" + columnName + "' = '" + search + "'; ")

这是类的完整代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class DBactionSearch implements ActionListener {

    JTextField textField1;
    JTextField textField2;
    JTextField textField3;
    public JTextField textField4;
    JTextField textField5;
    JTextField textField6;
    JTextArea textArea;
    String text1;
    String text2;
    String text3;
    String text4;
    String text5;
    String totalText;
    JComboBox comboBox;
    String search;

    public void getTextField1(JTextField textField1) {
        this.textField1 = textField1;
    }

    public void getTextField2(JTextField textField2) {
        this.textField2 = textField2;
    }

    public void getTextField3(JTextField textField3) {
        this.textField3 = textField3;
    }

    public void getTextField4(JTextField textField4) {
        this.textField4 = textField4;
    }

    public void getTextField5(JTextField textField5) {
        this.textField5 = textField5;
    }

    public void getTextField6(JTextField textField6) {
        this.textField6 = textField6;
    }

    public void setTextArea(JTextArea textArea) {
        this.textArea = textArea;
    }

    public void actionPerformed(ActionEvent e) {

        String e1 = textField1.getText();
        String e2 = textField2.getText();
        String e3 = textField3.getText();
        String e4 = textField5.getText();
        String e5 = textField6.getText();
        final String columnName = textField4.getText();

        System.out.println("columnName = " + columnName);

        switch (columnName) {
        case "firstname":
            search = e1;
            break;
        case "middlename":
            search = e2;
            break;
        case "lastname":
            search = e3;
            break;
        case "emailaddress":
            search = e4;
            break;
        case "phonenumber":
            search = e5;
            break;
        default:
            System.out.println("Error");
        }

        System.out.println("search = " + search);

        try {
            Class.forName("org.hsqldb.jdbc.JDBCDriver");
            Connection conn = DriverManager.getConnection("jdbc:hsqldb:file:///c:/hsqldb/mydb", "SA", "");

            Statement stmt = conn.createStatement();

            ResultSet rs = stmt.executeQuery(
                    "SELECT firstname, middlename, lastname, emailaddress, phonenumber FROM MY_TABLE WHERE '"
                            + columnName + "' = '" + search + "'; ");

            rs.next();
            // while (rs.next()) {
            text1 = rs.getString("firstname");
            text2 = rs.getString("middlename");
            text3 = rs.getString("lastname");
            text4 = rs.getString("emailaddress");
            text5 = rs.getString("phonenumber");
            // }

            // while (rs.next()) {
            // System.out.println(rs.getRow() + ". " + rs.getString("TITLE")
            // + "\t" + rs.getString("AUTHOR"));
            // }
        }

        catch (Exception excepton) {
            excepton.printStackTrace();
        }
        JFrame frame3 = new JFrame("Search result");
        frame3.setSize(350, 350);
        frame3.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame3.setLocation(500, 250);
        JPanel panel2 = new JPanel();
        panel2.setLayout(new GridLayout(1, 1));
        frame3.add(panel2);

        JTextArea textArea = new JTextArea();
        panel2.add(textArea);
        textArea.setVisible(true);

        totalText = " '" + text1 + "'   \n   '" + text2 + "'  \n   '" + text3 + "' \n" + " '" + text4 + "'  \n  '"
                + text5 + "' ";
        System.out.println("totalText = " + totalText);
        textArea.setText(totalText);

        frame3.setVisible(true);
    }
}

据我所知,您的代码中有两个错误。

首先,您没有正确建立SQL查询。 在将其发送到数据库之前,请尝试将其打印出来。 您将发现类似以下内容:

SELECT firstname, middlename, lastname, emailaddress, phonenumber FROM MY_TABLE WHERE 'middlename' = 'Fred';

发现错误? (向右滚动。)

您正在从MY_TABLE中选择所有字符串,其中字符串middleName和(在这种情况下) Fred相等。 当然,这些字符串不相等,因此您没有匹配的行。

您可能想运行以下查询:

SELECT firstname, middlename, lastname, emailaddress, phonenumber FROM MY_TABLE WHERE middlename = 'Fred';

请注意,在middlename周围不再有任何引号,因此middlename现在被解释为列名而不是字符串。 如果这是您想要的,请删除columnName变量两侧的SQL字符串中的单引号。

第二个问题在这里:

        rs.next();

您无需费心检查是否得到了任何结果。 通过从此方法返回false ,HSQL告诉您没有数据。 但是,您选择不收听此内容,而是继续读取数据。

相反,您要编写的内容如下所示:

        if (rs.next()) {
            // read the data out of the result set.
        } else {
            // handle the case that no matching data was found.
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM