【问题标题】:How can update a JdbcRowSet object?如何更新 JdbcRowSet 对象?
【发布时间】:2015-12-27 20:04:32
【问题描述】:

我想用一个 JdbcRowSet 对象执行以下 SQL 命令:

插入作者(名字、姓氏)值('Sue'、'Smith')

我知道我可以使用 Connection 和 Satements 对象执行,但我想使用接口 JdbcRowSet 来执行此操作,因为默认情况下一个 JdbcRowSet 对象是可更新和可滚动的。

我的代码是:

public class JdbcRowSetTest
{
    public static final String DATABASE_URL = "jdbc:mysql://localhost/books";
    public static final String USERNAME = "Ezazel";
    public static final String PASSWORD = "Ezazel";

    public JdbcRowSetTest()
    {
        try
        {
            JdbcRowSet rowSet = new JdbcRowSetImpl();
            rowSet.setUrl( DATABASE_URL );
            rowSet.setUsername( USERNAME );
            rowSet.setPassword( PASSWORD );
            rowSet.setCommand( "INSERT INTO Authors (FirstName,LastName) VALUES ('Sue', 'Smith')" );
            rowSet.execute();
        }
        catch( SQLException e )
        {
        }
    }

    public static void main( String[] args )
    {
        JdbcRowSetTest app = new JdbcRowSetTest ();
    }
}

SQLException 错误:

java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1086)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
    at com.mysql.jdbc.StatementImpl.checkForDml(StatementImpl.java:502)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2224)
    at com.sun.rowset.JdbcRowSetImpl.execute(JdbcRowSetImpl.java:582)
    at JdbcRowSetTest.(JdbcRowSetTest.java:23)
    at JdbcRowSetTest.main(JdbcRowSetTest.java:53)

【问题讨论】:

  • 您正在吞食异常。请检查它是否没有抛出异常并为我们提供堆栈跟踪。
  • SQLException 错误:java.sql.SQLException:无法使用 executeQuery() 发出数据操作语句。
  • 我以前什至没有注意到它,但setCommand 用于填充行集所需的 select 查询。您当前使用它的方式没有意义。更新/插入行集与使用(可更新的)ResultSet 完全相同。两者的 javadoc 还包括示例(您可能还想查看CachedRowSet)。

标签: java mysql jdbc


【解决方案1】:

您不能使用JdbcRowSet 来执行这样的插入语句。如果这是您想要的,那么您应该使用普通的StatementPreparedStatement

RowSet.setCommand 仅用于查询:

将此RowSet 对象的命令属性设置为给定的SQL 查询。当行集从不支持命令的数据源(例如电子表格)获取数据时,此属性是可选的。
参数:
cmd - 将被执行的 SQL 查询用于获取此 RowSet 对象的数据;可能为空

如果您真的想使用行集,那么您可以按照为可更新ResultSet 记录的方式更新或插入新行:

更新:

更新当前行中的列值。在可滚动的ResultSet 对象,光标可以前后移动,到一个绝对 位置,或相对于当前行的位置。以下 代码片段更新第五行的NAMEResultSet对象rs然后使用updateRow的方法更新 派生出rs 的数据源表。

rs.absolute(5); // moves the cursor to the fifth row of rs
rs.updateString("NAME", "AINSWORTH"); // updates the
// NAME column of row 5 to be AINSWORTH
rs.updateRow(); // updates the row in the data source

用于插入:

将列值插入插入行。可更新的ResultSet 对象有一个与之关联的特殊行,用作暂存 用于构建要插入的行的区域。下面的代码片段 将光标移动到插入行,构建一个三列行,然后 使用方法将其插入 rs 和数据源表中 insertRow.

rs.moveToInsertRow(); // moves cursor to the insert row
rs.updateString(1, "AINSWORTH"); // updates the
// first column of the insert row to be AINSWORTH
rs.updateInt(2,35); // updates the second column to be 35
rs.updateBoolean(3, true); // updates the third column to true
rs.insertRow();
rs.moveToCurrentRow();

请注意,根据我的经验,javax.sql.rowset 的参考实现通常无法按预期工作。使用纯 JDBC 可能会更好。

【讨论】:

    【解决方案2】:

    你不见了execute()

    使用 "Select" 语句查询并返回 JdbcRowSet:

    public void createJdbcRowSet(String url, String username, String password, String sql) {
        jdbcRs = new JdbcRowSetImpl();
        jdbcRs.setCommand(sql);
        jdbcRs.setUrl(url);
        jdbcRs.setUsername(username);
        jdbcRs.setPassword(password);
        jdbcRs.execute();
        // ...
    }
    

    更新:
    获得返回的 JdbcRowSet 后,您可以插入一个新行,如下例所示:

    public void updateJdbcRowSet(String username, String password) {
        jdbcRs.moveToInsertRow();
        jdbcRs.updateString("USERNAME", "NewUser");
        jdbcRs.updateString("PASSWORD", "ENCRYPTED");
        jdbcRs.insertRow();
    }
    

    【讨论】:

    • @Ezazel 它有效。将e.printStackTrace() 添加到您的catch 块中,看看您遇到了什么错误
    • SQLException 错误:java.sql.SQLException:无法使用 executeQuery() 发出数据操作语句。
    【解决方案3】:
    public static void main(String[] args) {
    
            try {
                RowSetFactory rowset =RowSetProvider.newFactory();
                JdbcRowSet jdbcrow=rowset.createJdbcRowSet();
                jdbcrow.setUrl(BD_Url);
                jdbcrow.setUsername(DB_User);   
                jdbcrow.setPassword(DB_password);
    //this is your database connectivity like uername,password and url and
     driver in not imp in mysql 5.1.23 jar file 
    
                jdbcrow.setCommand("Select * from Demo");
                jdbcrow.execute();
    //uppere parts is use to fetch the record from table
    
    
    
       System.out.println("--------------------Insert----------");
        jdbcrow.moveToInsertRow();
        jdbcrow.updateInt("ID", 115);
        jdbcrow.updateString("Username","Hitesh");
        jdbcrow.updateString("Password","Sir");
        jdbcrow.insertRow();
    

    //向下码用于更新值

    System.out.println("=--------------------Update-------------------------");
    jdbcrow.absolute(3);// 3rd row
    jdbcrow.updateString("Password","Sirs" ); //colname password 
    jdbcrow.updateRow();
    

    对于删除,您可以使用

    System.out.println("=-----------Delete-----------------------------");
    
    
    
        while (jdbcrow.next()) {  
                String id=jdbcrow.getString("Id"); 
             //here i getting  ID  record from my table
              System.out.println("s"   +id);
                if(id.equals("102")) { 
                //then i my Specifying that if my table iD is .eqauls to 102 then delete 
                  that record you also used this type to updatetbale
    
                     jdbcrow.deleteRow();
                    System.out.println("gaye");
                    break;
                }
            }
            //if record delete then preform `enter code here`some operation
    

    //这用于从表中删除最后一条记录

    System.out.println("=---------------delete-------------------------");
        jdbcrow.last();
        jdbcrow.deleteRow();
    

    【讨论】:

    • 请同时添加一些解释性文字,而不仅仅是代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2016-02-16
    • 1970-01-01
    • 2013-09-09
    • 2017-12-21
    相关资源
    最近更新 更多