Java:缓存的RowSet insertRow失败:SQLException

时间:2015-08-06 18:53:03

标签: java mysql jdbc

所以我试图理解如何使用RowSet API,特别是CachedRowSet,我觉得我在过去一小时左右的时间里一直在砸墙,并且可以使用一些帮助。

我在MySQL数据库中设置了一些非常简单的表,我用它来测试它。我还应该补充一点,我正在尝试使用RowSet做的一切我已经能够成功地使用ResultSet,这让我相信问题在于我使用的是ResultSet API,而不是我正在尝试的操作做自己。

无论如何,我正在尝试使用ResultSet插入一个新行。我会在此处粘贴我的代码,然后在下面添加一些注释:

CachedRowSet rowSet = null;
    try {
        RowSetFactory rsFactory = RowSetProvider.newFactory();
        rowSet = rsFactory.createCachedRowSet();
        rowSet.setUrl("jdbc:mysql://localhost:3306/van1");
        rowSet.setUsername("####");
        rowSet.setPassword("####");

        rowSet.setKeyColumns(new int[]{1});

    } catch (SQLException e) {
        e.printStackTrace();
    }

    String query = "select * from phone";

    try {
        rowSet.setCommand(query);
        rowSet.execute();
        printTable(rowSet);

        rowSet.moveToInsertRow();

        rowSet.setInt(1, 4);
        rowSet.setString(2, "Mobile");
        rowSet.setString(3, "1");
        rowSet.setString(4, "732");
        rowSet.setString(5, "555");
        rowSet.setString(6, "1234");
        rowSet.setString(7, "");

        rowSet.insertRow();
        rowSet.moveToCurrentRow();
        rowSet.acceptChanges();
        printTable(rowSet);
    } catch (SQLException e) {
        e.printStackTrace();
    }

因此,正如您所看到的,我正在尝试使用新的电话号码更新电话号码表。以下是详细信息:

1)所有电话号码字段都是数据类型char,因此前导零不会丢失。

2)我正在使用JDBC API提供的默认CachedRowSet实现,而不是MySQL驱动程序中的任何特定实现。不确定这是否重要,但我把它放在这里以防万一。另外,我没有看到从驱动程序库导入CachedRowSet的选项。

3)我正在为表中的每一列设置一个值,因为RowSet API不允许插入行而没有每列的值。

4)我已经尝试使用setter方法和更新方法进行操作。两种方式都有相同的结果。

5)据我所知,我在执行insertRow()方法时在插入行上。我也在调用acceptChanges()之前返回当前行,但由于我的代码永远不会那么远,我无法对该部分发表评论。

6)异常是在insertRow()方法的调用上抛出的SQLException(其中没有链接的异常)。这是堆栈跟踪:

java.sql.SQLException: Failed on insert row
at com.sun.rowset.CachedRowSetImpl.insertRow(Unknown Source)
at firsttry.RowSetPractice.rowSetTest(RowSetPractice.java:87)
at firsttry.RowSetPractice.main(RowSetPractice.java:20)

所以,我没有想法。任何帮助,将不胜感激。我已经搜索了我能找到的这个网站上的每一个帖子,我看到的是关于它在acceptChanges()方法而不是insertRow()上失败的东西。

0 个答案:

没有答案