【问题标题】:Exception generated when updating table - java更新表时产生异常 - java
【发布时间】:2013-05-03 15:00:35
【问题描述】:

以下代码有效 - 表已更新(通过查看代码执行前后的表内容在 SQL 服务器上确认)。

但是,当我在 NetBeans 和命令行中运行程序时,只要执行“rs = stmt.executeQuery(SQLquery);”,CATCH 块就会捕获异常.

我知道这一点是因为 CATCH 块之前的行“System.out.println("更新成功!");" 从未执行过。如果我将它移到“rs = stmt.executeQuery(SQLquery);”之后,它也不会执行。

异常错误是:

run:
The statement did not return a result set.
BUILD SUCCESSFUL (total time: 0 seconds)

我不明白我做错了什么。

我确实尝试使用“rs = stmt.executeUpdate(SQLquery);”而不是“rs = stmt.executeQuery(SQLquery);”,但 NetBeans 有当我将鼠标悬停在它上面时,带有红色感叹号:

incompatible types
    required: ResultSet
    found: int

如果我编译它,NetBeans 会把它吐出来:

C:\Java\Example\src\example\Example.java:56: error: incompatible types
            rs = stmt.executeUpdate(SQLquery);
                                   ^
  required: ResultSet
  found:    int
1 error

咕噜。我要疯了! 请帮忙!

package example;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

class Example
{
    public static void main(String args[])
    {
        String host = "jdbc:sqlserver://SERVER1\\Primrose;databaseName=Primrose";
        String uName = "sa";
        String uPwd = "Pr1m@f@ct";

        String SQLquery = "";

        int totalFolders = 4;

        int getRecId = 0;
        String getUser = "";
        String getSection = "";
        String getKey = "";
        String getValue = "";
        String getExtraInfo = "";

        try
        {
            Connection con = DriverManager.getConnection(host, uName, uPwd);
            Statement stmt = con.createStatement();

            SQLquery = "SELECT * FROM _Registry WHERE (Section = 'RecIds' AND Key_ = '_Folders' AND User_ = 'sc_general')";

            ResultSet rs = stmt.executeQuery(SQLquery);

            while (rs.next())
            {
                getRecId = rs.getInt("RecId");
                getUser = rs.getString("User_");
                getSection = rs.getString("Section");
                getKey = rs.getString("Key_");
                getValue = rs.getString("Value");
                getExtraInfo = rs.getString("ExtraInfo");

                getValue = getValue.trim();                         // Strip trailing spaces from string
                int newValue = Integer.parseInt(getValue) + 1;      // Convert string to number so I can add it to total folders
                newValue = newValue + totalFolders;                 // Change to total + existing value to write back to dB
                getValue = Integer.toString(newValue);              // Convert to string as required by the table
            }

            SQLquery = "UPDATE _Registry SET Value=" + getValue + " WHERE (RecId = 5 AND User_ = 'sc_general' AND Section = 'RecIds' AND Key_ = '_FOLDERS')";

            rs = stmt.executeQuery(SQLquery);

            rs.updateInt( "RecId", getRecId );
            rs.updateString( "User_", getUser );
            rs.updateString( "Section", getSection );
            rs.updateString( "Key_", getKey );
            rs.updateString( "Value", getValue );
            rs.updateString( "ExtraInfo", getExtraInfo );
            rs.updateRow();

            System.out.println("Updated successfully!");
        }

        catch ( SQLException err )  
        {
           System.out.println( err.getMessage( ) );
        }
    }
}

【问题讨论】:

    标签: java sql exception


    【解决方案1】:

    函数“stmt.executeUpdate(SQLquery);”返回一个整数,因为您没有从数据库中检索任何数据。试试这个:

    Integer c = stmt.executeUpdate(SQLquery);
    

    整数值表示已更改的行数。

    【讨论】:

      【解决方案2】:

      查看您正在使用的 JRE 的 PreparedStatement 的 javadocs。 PreparedStatement.executeUpdate() 返回已更新行数的 int。 Here 是 PreparedStatement 文档的链接。

      【讨论】:

        【解决方案3】:

        executeUpdate 返回一个 int,而不是一个结果集。 http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/Statement.html#executeUpdate(java.lang.String)

        int nbUpdatedResult = stmt.executeUpdate(SQLquery);
        

        【讨论】:

        • 非常感谢,这样做了(并删除了 rs.update 行):)
        【解决方案4】:

        executeUpdate 方法返回受影响的行数,这就是您出现此错误的原因。

        所以用这个方法很好。但您不会检索已编辑的值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-31
          • 1970-01-01
          • 2015-12-06
          • 1970-01-01
          • 2023-02-10
          • 1970-01-01
          • 2021-12-31
          • 2019-04-12
          相关资源
          最近更新 更多