我为可滚动的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 ,但在尝试更新数据时会出错。 任何人都可以告诉我这是什么原因吗?
答案 0 :(得分:6)
原因是您正在使用Select
查询并尝试执行Update
操作
ResultSet rs = stmt.executeQuery("select * from EMPLOYEE");
另一点是“SELECT *”将结果集设为 ReadOnly
如果您要执行更新操作,则需要在选择查询
中指定列答案 1 :(得分:2)
如果给定的查询不适合所请求的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