所以我试图理解如何使用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()上失败的东西。