MySQL-java.sql.SQLException︰ 结果集是从更新。没有数据

标签: JDBC MySQL Java
发布时间: 2017/1/9 22:54:46
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
public static void main(String args[])
    {

            SQLConnector sqlConnect = new SQLConnector();
            Connection conn = null;
            try
            {
            conn= sqlConnect.getConnection();
            CallableStatement cStmt = conn.prepareCall("{ call test(?,?,?)}");
            cStmt.setDouble(1, 100.0);
            cStmt.setInt(2, 1);
            cStmt.registerOutParameter(3, java.sql.Types.VARCHAR);
            ResultSet rs = cStmt.executeQuery();
            if (rs.next()) {
                System.out.println(rs.getString(3);
                }
            cStmt.execute();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                sqlConnect.closeConnection(conn);
            }
        }

这段代码将引发错误

java.sql.SQLException: ResultSet is from UPDATE. No Data.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)

但如果我通过相同的参数从 MySQL 工作台它给出了正确的输出。

我使用 MySQLServer 5.6.25 和 MySQLConnector 5.1.6。

请帮我解决这个问题。这看起来像我从 Java 调用 MySQL 的方式中的一个 bug

解决方法 1:

见此 MySQL 文档页第 4 部分︰使用 JDBC CallableStatements 到执行存储过程

你不要使用 executeQuery() 。您必须使用 execute()getResultSet()

既然你知道该语句会返回完全一个 ResultSet ,你的代码变得︰

cStmt.execute();
try (ResultSet rs = cStmt.getResultSet()) {
    if (rs.next())
        System.out.println(rs.getString(3));
}

除了当然你可能是错的因为该调用不返回结果集,但而在输出参数中返回一个字符串,并完全更改代码︰

cStmt.execute();
System.out.println(cStmt.getString(3));
官方微信
官方QQ群
31647020