目录
关于行集 简单地说,CachedRowSet 用于存储从数据库中检索的数据;而 CachedRowSetDataProvider 是一个包装器,用于包装 CachedRowSet 中保存的数据。CachedRowSetDataProvider 的主要作用是可以在 IDE 中便捷地对组件进行绑定。实际上,CachedRowSetDataProvider 保存的唯一信息是光标在 CachedRowSet 中的位置。可以让多个 CachedRowSetDataProvider 实例引用相同的 CachedRowSet,每个实例可以在 CachedRowSet 中分别具有其自己的光标位置。 应该使用 CachedRowSet 还是 CachedRowSetDataProvider? 虽然 CachedRowSet 可以很好地执行将数据插入到数据库表中的操作,但是 CachedRowSetDataProvider 可以为您提供一种更简便的编码方法。您可以使用 CachedRowSetDataProvider 方法来访问 CachedRowSet,而不是直接对 CachedRowSet 进行编码。但是,无论是否使用 CachedRowSetDataProvider,都必须先创建 CachedRowSet。请记住,如果将数据库表放到页面上,IDE 将自动为该表创建 CachedRowSet(在会话 Bean 中)和 CachedRowSetDataProvider(在其页面中)。CachedRowSet 的 command 属性(即 SELECT 语句)可以为数据库 INSERT 操作提供键。IDE 生成的表 INSERT 命令包含 CachedRowSet 的 command 属性中的所有列。例如,假设行集的 command 属性是 SELECT col1, col2 FROM mytable。此行集的 INSERT 命令将变为 INSERT INTO mytable(col1,col2) values(?,?)。 两个代码示例 让我们看一下两个代码示例。代码示例 1 展示了如何使用 CachedRowSet 插入一行;而代码示例 2 展示了如何使用 CachedRowSetDataProvider 执行相同的插入操作。两个示例都假定您事先为数据库表创建了 CachedRowSet。此外,这些示例还假定页面中包含了一个消息组组件,用于向用户显示错误消息。请注意,通过对消息组组件的 error 或 info 方法的方法调用,可以向用户显示 CachedRowSet 或 CachedRowSetDataProvider 中抛出的任何错误。 首先,让我们了解一下使用 CachedRowSet 方法插入行时所需的操作。要使用 CachedRowSet 插入行,请先调用 execute 方法(如果尚未执行此操作),然后使用 moveToInsertRow 方法将 CachedRowSet 定位到正确的行上(execute 方法使用数据来填充 CachedRowSet 对象,方法是通过连接到数据库来读入数据,请注意,如果在提交任何重要的更新之前调用 execute 方法,将会丢失这些更新)。定位到正确的行后,使用不同的 CachedRowSet 更新方法(updateString、updateInt 等,具体取决于列类型)将列字段更新为新值,然后调用 insertRow 方法以插入该行。最后,请调用 CachedRowSet acceptChanges 方法将更新应用到数据源。如果发生冲突,则还必须捕获所有 SyncProvider 异常。捕获错误代码需要完成额外的工作才能构建有意义的消息。请参见代码示例 1。
CachedRowSet crs = getSessionBean1().getMyRowSet() ;
try {
crs.execute() ; // unless it's already been executed.
crs.moveToInsertRow() ;
crs.updateInt("COL1", 1 ) ;
crs.updateString("COL2","Row 1") ;
crs.insertRow() ;
crs.acceptChanges() ;
info("Row Inserted via CachedRowSet") ;
crs.release() ; // release rowset memory
} catch (SyncProviderException spe) {
try {
// construct a message with all the possible
// exceptions in the SyncProvider.Note that since
// we're doing an INSERT, we should only care about
// SyncResolver.INSERT_ROW_CONFLICT, but I'll handle
// them all here.
SyncResolver resolver = spe.getSyncResolver();
String message = spe.getMessage() + ":";
while(resolver!=null&&resolver.nextConflict()) {
int row = resolver.getRow();
if (!message.equals("")) {
message += ";";
}
String zbrow = Integer.toString(row - 1) ;
switch (resolver.getStatus()) {
case SyncResolver.DELETE_ROW_CONFLICT:
message += "DELETE_ROW_CONFLICT: " + zbrow ;
break;
case SyncResolver.INSERT_ROW_CONFLICT:
message += "INSERT_ROW_CONFLICT: " + zbrow ;
break;
case SyncResolver.UPDATE_ROW_CONFLICT:
message += "UPDATE_ROW_CONFLICT: " + zbrow ;
break;
}
if (resolver instanceof SyncResolverX) {
message += ": " + ((SyncResolverX)resolver).getSQLException() ;
}
}
error( message ) ;
} catch (SQLException sqle) {
error( sqle.getMessage() ) ;
}
} catch (SQLException sqle) {
error(sqle.getMessage() ) ;
}
代码示例 1:使用 CachedRowSet 插入行代码示例 2 说明了使用 CachedRowSetDataProvider 方法能够更简单地在数据源中插入行。首先,使用 appendRow 方法为 CachedRowSetDataProvider 附加一个空行。然后,调用 setCursorRow,将 CachedRowSetDataProvider 的光标定位到新行的位置。无论使用何种列类型,均使用相同的 setValue 方法来设置不同的列值。最后,调用 commitChanges 将更改提交到数据源中。只需使用一个简单的 catch 语句,即可捕获可能发生的所有错误。
您可以使用 CachedRowSetDataProvider.insertRow 方法在指定行之前插入新行,而不是附加一行。如果这样,则需要知道要插入的新行后面一行的 RowKey,并将该值作为参数传递给 insertRow 方法。
CachedRowSetDataProvider cdp = getMyDataProvider() ;
try {
RowKey rk = cdp.appendRow() ;
cdp.setCursorRow(rk) ;
cdp.setValue("COL1", new Integer(1) ) ;
cdp.setValue("COL2", "Row 1" ) ;
cdp.commitChanges() ;
info("Row Inserted via Data Provider") ;
cdp.refresh() // release rowset memory.
} catch (Exception ee) {
error( ee.getMessage() ) ;
}
代码示例 2:使用 CachedRowSetDataProvider 插入行现在您已知道如何使用 CachedRowSet 和 CachedRowSetDataProvider 在数据库表中插入行了,您愿意使用哪种方法呢?特别是当两种方法都能完成此任务时,您应该选择一种最简便的方法。使用 CachedRowSetDataProvider 只会产生很小的开销,因此,请放心地使用它吧,它能带给您更简单易用的操作。 将行插入到数据库中的提示 无论使用哪种方法,将行插入到数据源时都需要注意一些问题。本部分列出了处理某些问题的一些提示。
详细信息 要获取有关 CachedRowSet 的详细信息,请通过 Java Studio Creator 的“帮助”菜单或“动态帮助”窗口来参阅行集的 Javadoc API 引用。同时也可以参阅 JDBC Javadoc,但 Java Studio Creator 的 CachedRowSet 接口实现方式略有不同。 有关 CachedRowSetDataProvider 的详细信息,可以参阅同一“动态帮助”窗口(或使用“帮助”菜单)中的 Javadoc 数据提供器 API 引用。请参见图 2。
还应该访问 Joel 的有关使用 CachedRowSet 和 CachedRowSetDataProvider 的博客文章:http://blogs.sun.com/roller/page/jfbrown。 更多的开发者资源 有关为开发者提供的更多技术提示、文章和专家建议,请访问 Sun Developer Network (SDN) 上的 Java Studio Creator 开发者资源,网址为:http://gceclub.sun.com.cn/prodtech/javatools/jscreator/。 |
| ||||||||||||||||||||||||||||
|
| ||||||||||||