结果集更新错误

时间:2014-01-28 19:12:04

标签: java jdbc

我为可滚动的resultset写了一个简单的代码。但它给了我一个错误。

import java.sql.*;
import java.util.Properties;

public class Scrollable_Resultset {

public static void main(String[] args) throws Exception{

    Properties p = new Properties();
    p.put("user", "system");
    p.put("password", "password");

    DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe",p);

    Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

    ResultSet rs = stmt.executeQuery("select * from EMPLOYEE");

    System.out.println("Displaying all the rows of the result set forward");
    while(rs.next())
    {
        System.out.println(rs.getInt(1));
        System.out.println(rs.getString(2));
        System.out.println(rs.getInt(3));
        System.out.println("--------------");
    }//end of while
    System.out.println("****************");

    System.out.println("Printing resultset in reverse order");
    rs.last();//go to last row
    while(rs.previous())
    {
        System.out.println(rs.getInt(1));
        System.out.println(rs.getString(2));
        System.out.println(rs.getInt(3));
        System.out.println("--------------");
    }//end of while
    System.out.println("****************");

    System.out.println("Printing only 1st row");
    rs.first();
    System.out.println(rs.getInt(1));
    System.out.println(rs.getString(2));
    System.out.println(rs.getInt(3));
    System.out.println("--------------");
    System.out.println("****************");

    System.out.println("Printing 3rd row of original data set");
    System.out.println(rs.getInt(1));
    System.out.println(rs.getString(2));
    System.out.println(rs.getInt(3));
    System.out.println("--------------");
    System.out.println("****************");

    System.out.print("No of rows before modification: ");
    rs.last();
    System.out.println(rs.getRow());
    System.out.println("****************");

    System.out.println("Updating 3rd row");
    rs.absolute(3);
    rs.updateInt(1, 999);
    rs.updateString(2,"John");
    rs.updateInt(3, 99000);
    rs.updateRow();
    System.out.println("****************");

    System.out.println("Inserting a new row");
    rs.moveToInsertRow();
    rs.updateInt(1, 99);
    rs.updateString(2,"Michael");
    rs.updateInt(3, 909);
    rs.insertRow();
    System.out.println("Deleting the 6th row");
    rs.absolute(6);
    rs.deleteRow();
    System.out.println("****************");
    con.close();
}

}

错误

Exception in thread "main" java.sql.SQLException: Invalid operation for read only    resultset: updateInt
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java)
at oracle.jdbc.driver.BaseResultSet.updateInt(BaseResultSet.java)
at jdbc.Scrollable_Resultset.main(Scrollable_Resultset.java:64)

虽然我使用了 ResultSet.CONCUR_UPDATABLE ,但在尝试更新数据时会出错。 任何人都可以告诉我这是什么原因吗?

4 个答案:

答案 0 :(得分:6)

原因是您正在使用Select查询并尝试执行Update操作

ResultSet rs = stmt.executeQuery("select * from EMPLOYEE");

另一点是“SELECT *”结果集设为 ReadOnly

如果您要执行更新操作,则需要在选择查询

中指定列

答案 1 :(得分:2)

请参阅Oracle JDBC documentation

如果给定的查询不适合所请求的ResultSet类型,Oracle JDBC驱动程序将尝试降级返回的ResultSet。在您的情况下,使用*通配符可能会阻止创建可更新的ResultSet(有更多限制,请查看文档)。要验证原因,您应该使用ResultSet的getWarnings()方法。如果必须降级,Oracle JDBC驱动程序应该设置警告。

建议的解决方法是使用表别名,如:

SELECT t.* FROM employee t

注意:如果您打算在(关键)应用程序中使用此机制,请务必仔细阅读文档。例如,通过ResultSet静默更新会忽略冲突。从这一点来看,如果JDBC实现中存在更多陷阱,我不会感到惊讶。

答案 2 :(得分:0)

包括以下更改

ResultSet rs = stmt.executeQuery("select EMPLOYEE.* from EMPLOYEE");

答案 3 :(得分:0)

几乎没有可能:

  • 错误的驱动程序:确保正确的驱动程序
  • “SELECT * FROM EMPLOYEE”使用 wildchar ,Oracle不知道列的确切顺序,请指定列的确切列表和ROWID

    SELECT ENOWID,...来自ENPLOYEE E