服务器 频道

为DB2编写表编辑器GUI(下篇)

  【IT168 服务器学院】输入每一列的值并单击 Add New Row后,输入的值临时存储在散列表中,该表的键就是列名。这个信息被传递到方法addRowToDatabase。ResultSetModel.java 的这个方法承担向数据库添加所需的行的任务。

  当然,始终存在输入非法数据的可能性。这里的“非法”指的是使用无效字符和向非空列输入空值等行为。当 addRowToDatabase 方法试图添加一个被认为非法的行时,会抛出一个 SQL 异常。因此,添加将不被允许,而且您将看到一个如图 7 中所示的错误。

  
图 7. 错误对话框
 
  另一方面,如果要在所需行中添加的数据是“合法的”,实用程序会把该行附加到当前的表。结果,GUI 自动被更新(如图 8 所示)。请留意 Tom Little 的新行。

  

图 8. 添加到 TEST 表的新行

  删除行

  要删除行,所有您要做的就是单击该行来选择它(如图 9 所示),然后单击 Delete Row。负责从数据库删除行的方法是 deleteRow,可在 ResultSetModel.java 中找到。

  

图 9. 从 TEST 表删除行

 
  更新现有行

  要更新现有的行,选择一个单元(图 10 中选择了姓名Jones),然后输入新值。您可以在多个行中对多个列进行更改。每个编辑过的单元显示为红色。编辑完成后,单击 Update Database 在数据库中进行更新。

  

图 10. 更新 TEST 表中的多个值

  负责进行更新的方法是 updateDatabase,可以在 ResultSetModel.java中找到。这个程序跟踪表中单元所做的更改。当单击 Update Database 时,方法 updateDatabase() 在每个修改的行重复执行,并将更改推送至数据库。正如添加新行时有错误发生会显示一个错误对话框一样,更新现有行时出现错误会显示一个对话框。因为您可能在一次更新中操作多个行,所以对每个有错误的行都会显示一个对话框(请参阅图 11)。

   

图 11. 对每个更新得不正确的行显示的错误对话框

  请注意在错误对话框标题中标识出了行号。有了这个信息,就可以方便地标识一行,因为行号是每行的第一列。

  并行性所涉问题:注意我们设置中涉及的并行性问题是重要的。当从数据库检索数据时,我们没有锁定记录。因此,在尝试更新某一行时,可能有另一个用户进入并操作您正在处理的同一行。我们更新一行的方法本质上是在更新前对该行的内容进行快照。然后允许您声明希望更改的内容。然后您告诉数据库您希望更改与快照相似的行。如果与快照相似的行不存在(可能由于竞态条件而发生),那么更新操作将不会执行。有两行与快照的标识相匹配的可能性很小(在设计得很差的数据库模型中)(请参阅限制以了解关于这个问题的更多信息)。

   
  面临的复杂情况

  我们使用 IBM 提供的 JDBC 驱动程序开发 SQL Utility 应用程序。遗憾的是,因为我们使用的驱动程序当前不提供可滚动和可更新的 java.sql.ResultSet 实现,所以编码 SQL Utility 应用程序的工作会稍稍麻烦一点。我们必须对整个 ResultSet 对象重复执行并且在本地存储信息,而不是滚动到我们感兴趣的行。这个方法在 ResultSetModel.java 中可见。当然,拥有可滚动的 ResultSet 本来可以使方法 reloadTableModel() 中的所有代码更简单。但是,我们的变通方法可以完成这项工作。

  另外,缺少可更新的 ResultSet 实现意味着我们必须创建 SQL Update 查询以更改数据库,而不是使用 jaba.sql.ResultSet 接口的 updateXXX() 方法。因此,在方法 updateDatabase() 中,我们必须动态地生成 SQL 更新语句。

  限制:缺少可更新的 ResultSet 还会在我们的实用程序中产生一些限制。要删除或更新一行,该行必须是被唯一标识的。如果有可更新的结果集,这会自动发生。但我们必须自己标识感兴趣的行,而这正是可能遇到问题的地方。我们按以下方法在用于更新或删除的 SQL 查询中标识感兴趣的行。

0
相关文章