【问题标题】:Sql Exception Illegal operation on empty result set while it's working on My Sql WorkbenchSqlexception 在 Mysql Workbench 上工作时对空结果集进行非法操作
【发布时间】:2017-09-17 08:32:35
【问题描述】:

我想用这个类使 SQL 操作更容易,但是我得到一个异常,表明结果集是空的。相同的查询在 MySQL 工作台中工作。我不明白问题是什么。

import java.sql.*;

public class DataBase
{
    private String user = "jsmith";
    private String pass = "LetMeIn";
    private String url = "jdbc:mysql://localhost:3306/java";
    private String Schema, Table;
    private Connection con;
    private ResultSet Result;
    private PreparedStatement pQuery;

    public DataBase(String Database, String Table)
    {
        this.Schema = Database;
        this.Table = Table;
    }

    private boolean createConnection()
    {
        boolean b = false;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(url, user, pass);
            b = true;
        } catch (Exception e) {
            System.out.println("Connection Exception " + e.getMessage());
            e.printStackTrace();
            b = false;
        }
        return b;
    }

    public String getStringData(String Desireddata, String fromColumn, String condition)
    {
        boolean b = createConnection();
        String retrivedString = "";
        if (b != false && Schema != null && Table != null) {
            try {
                pQuery = con.prepareStatement("SELECT ? FROM " + Schema + "." + Table + " WHERE ? = ?");
                pQuery.setString(1, Desireddata);
                pQuery.setString(2, fromColumn);
                pQuery.setString(3, condition);
                Result = pQuery.executeQuery();
                Result.next();
                retrivedString = Result.getString(Desireddata);
            } catch (Exception e) {
                retrivedString = "False";
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
        } else {
            System.err.println("No Connection or Database not Defined ");
            retrivedString = "False";
        }
        return retrivedString;
    }
}

还有例外:

Illegal operation on empty result set.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1056)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:817)
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5514)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5434)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5474)
    at sync.DataBase.getStringData(DataBase.java:44)
    ...

【问题讨论】:

  • 您不能对对象名称(表、列等)使用参数绑定,只能对值使用。

标签: java mysql exception


【解决方案1】:

你有两个问题:

  1. 你不能对对象名使用参数绑定,所以SELECT ? FROM...是无效的。
  2. 您没有检查来自ResultSet.next() 的返回值。如果返回true,则有数据要读取,如果返回false,则没有更多数据。

要解决第一个问题,您需要从以下位置更改代码:

pQuery = con.prepareStatement("SELECT ? FROM ... WHERE ? = ?");

到:

pQuery = con.prepareStatement("SELECT " + Desireddata + " FROM ... WHERE " + fromColumn + " = ?");

但请确保DesireddatafromColumn 不是直接来自用户输入,否则您将容易受到 SQL 注入攻击。

要解决第二个问题,请更改:

Result.next();
retrivedString = Result.getString(Desireddata);

到:

while (Result.next()) { /* You COULD use 'if' instead */
    retrivedString = Result.getString(Desireddata);
}

虽然不是问题,但从风格上讲,您不应该有以大写字母开头的实例变量。因此,您应该使用resultresultSetrs 而不是Result。通常,如果您要定义一个新类型(如classinterface),您只会使用大写字母作为第一个字符。

【讨论】:

    【解决方案2】:

    您的结果集结果为空。所以在处理之前,先检查Result是否为null。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 2016-04-30
      • 2015-08-01
      • 2014-06-23
      • 1970-01-01
      相关资源
      最近更新 更多