Sql 异常 在空结果集在我的 SQL 工作台上工作时对空结果集执行非法操作



我想使SQL操作更轻松,但是我得到了一个例外,表明结果集为空。同样的查询在MySQL Workbench中工作。我不明白问题是什么。

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)
    ...

您有两个问题:

  1. 您不能在对象名称上使用参数绑定,因此SELECT ? FROM...无效。
  2. 您没有检查ResultSet.next()的返回值。如果它返回true,则可以读取数据,如果它返回false,则没有更多的数据。

要解决第一个问题,您需要从:

上更改代码
pQuery = con.prepareStatement("SELECT ? FROM ... WHERE ? = ?");

to:

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

,但请确保DesireddatafromColumn不是直接从用户输入中得出的,否则您将容易受到SQL注入攻击的影响。

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

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

to:

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

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

您的结果集结果为空。因此,在处理之前,请检查结果是否为null。

最新更新