您现在的位置:多问网知识中心电脑教学数据库教程使用视图 - 尝试二

使用视图 - 尝试二

06-11 18:16:36   浏览次数:48626  栏目:数据库教程
标签:sql数据库教程,access数据库教程,oracle数据库教程,http://www.duowen123.com 使用视图 - 尝试二,

第三节 使用视图 - 尝试二

那么,是不是在这种情况下视图是没有用处呢? 你是不是要向它们投降了? 而不准备进行更多尝试了。上面的问题是视图是由两个表组成,而且你没有控制 Visual FoxPro 如何插入或更新记录。在图书馆数据库方案中,有一些你必须遵循的特殊规则。
作为一个可选的方法,表单 MEMBVEW2.SCX 使用三个视图而不是两个。视图 vMemberTable,vAdultTable 和 vJuvenileTable 都是基于单个的 SQL Server 表。

载入表单

表单仍然是以无数据方式打开。三个视图都是以 NoData 选项打开并设置为开放式行缓存。
三个视图都基于想同的共享连接。视图的 ConnectHandle 属性保存着视图使用的连接的句柄该句柄将会被立即使用。
* 视图使用的连接句柄是什么?
ThisForm.nHandle = CursorGetProp("ConnectHandle", ;
  "vMemberTable")

定位一个成员

当用户想要查看一个新的成员的信息时,他们仍然需要提供一个 member ID 并按下 Locate。该表单中的代码与早期版本稍稍不同的是,Member 视图首先被 requery。如果没有找到记录你立即知道 ID 是无效的。Adult 视图其次被 requery。如果没有找到记录则成员肯定是一个少年。

保存修改

在早期版本的表单中,当用户按下 Save时,简单地发布一条 TableUpdate()。正象你所看到的一样,对于特定结构的表那是不够的。该版本的表单采用了一种更复杂但更成功的方法。如果用户当前添加了一条记录,保存按钮的 Click 事件代码的前半段将运行。
If ThisForm.lAddMode = .T.
  Wait Window "保存新成员信息..." NoWait

代码首先添加新成员到 Member 表。然后添加一条记录到 Adult 表。两个表都可能添加一条新记录,也可能都不添加。因此必须启动一个事务处理。连接的 Transactions 属性用于控制事务处理过程。在表单的 Load 方法中,保存了视图的连接句柄到表单的 nHandle 属性中。SQLSetProp() 使用它来启动一个事务处理。
  * 开始一个事务处理
  = SQLSetProp(ThisForm.nHandle, "Transactions", 2)

vMemberTable 视图被选定并发布一条 TableUpdate()。若无问题则新成员的名字信息已添加到 Member 表中。并且成员会有一个成员 ID。如果 TableUpdate() 失败用户会看到发生了什么事并用 SQLRollback() 函数回滚事务处理。
* 添加新成员到 member 表
  Select vMemberTable
  If Not TableUpdate()
    ThisForm.ShowError
    * 回滚事务处理
    = SQLRollback(ThisForm.nHandle)
    Return
  Endif

如果 TableUpdate() 成功则添加一条新记录到 Member 表中。接着是找出分配了什么成员 ID。SQLExec() 用于发送一条 Select 语句到 SQL Server。该 Select 取回 @@Identity 的值, 它保存了最后插入到表中的 Identity 值。在我们的情况下是成员 ID。SQLExec() 使用视图使用的相同的连接句柄。这是有效的,因为它不需要另一个与 SQL Server 的连接。
  * 找出新成员的 member_no
  If SQLExec(ThisForm.nHandle, "Select @@identity")< 0
<略去的代码>

在 vAdultTable 视图中的 member_no 被 @@Identity 的值替换。这强制保持 Member 与 Adult 表间的关系。注意这包括了修改 Adult 表的主关键字段。没有其它选择。该成员的终止日期设置为从本日起一年的时间,并用TableUpdate() 来保存该信息到 Adult 表。如果发生错误事务处理回滚。这会删除 Member 表中的记录。
  * 添加新成员到 adult 表
  Select vAdultTable
  * member_no 是主关键字但因足够的理由在视图中更新。
  * 终止日期是从今日起一年时间。
  Replace member_no With sqlresult.exp, ;
          expr_date With DToT(GoMonth(Date(),12))
  If Not TableUpdate()
<略去的代码>

如果在此时此刻一切正常则用 SQLCommit() 函数提交事务处理。如果提交失败则回滚以前的所有操作。
  * 一切正常因此提交事务处理。
  If SQLCommit(ThisForm.nHandle) < 0
    ThisForm.ShowError
    * 回滚事务处理
    = SQLRollback(ThisForm.nHandle)
  Else
<略去的代码>

如果用户没有添加新成员,,是代码稍稍要简单一些。仍然要启动事务处理。首先保存 Member 表中的信息然后保存 Adult 和 Juvenile 表中的信息。如果一切正常则提交事务处理。否则回滚。
Else
  Wait Window "保存成员信息..." NoWait

  * 开始事务处理
  = SQLSetProp(ThisForm.nHandle, "Transactions", 2)

  * 保存信息到 member 表
  Select vMemberTable
  If Not TableUpdate()
<略去的代码>

  * 保存信息到 adult 表
  Select vAdultTable
  If Not TableUpdate()
<略去的代码>

* 一切正常因此提交事务处理。
  If SQLCommit(ThisForm.nHandle) < 0
    ThisForm.ShowError
    * 回滚事务处理
    = SQLRollback(ThisForm.nHandle)
  Else
    = MessageBox("该成员信息已经 " + ;
                 "保存。", MB_ICONINFORMATION)
  Endif
Endif

删除一个成员

每一个表使用一个视图不仅允许解决添加新成员的问题,也解决了不能删除成员的问题。当用户按下 Delete 按钮时启动一个事务处理。Adult 或 Juvenile 表中的成员记录首先被删除。Delete 应用于视图并且 TableUpdate() 发送它到 SQL Server。如果 TableUpdate() 未成功则回滚事务处理。
* 在视图连接上开始一个事务处理
= SQLSetProp(ThisForm.nHandle, "Transactions", 2)

If RecCount("vJuvenileTable") = 0
  Select vAdultTable
  Delete
Else
  Select vJuvenileTable
  Delete
Endif  
If Not TableUpdate()
  ThisForm.ShowError
  * 回滚事务处理
  = SQLRollBack(ThisForm.nHandle)
<略去的代码>

如果相应的 Adult 或 Juvenile 记录已经删除,就可以删除 Member 表的记录。Delete 也有可能失败,例如该成员还有未结清的借书。在这种情况下回滚事务处理且 Adult 或 Juvenile 记录放回到相关的表中。
Select vMemberTable
Delete
If Not TableUpdate()
  ThisForm.ShowError
  * 回滚事务处理
  = SQLRollBack(ThisForm.nHandle)
<略去的代码>

如果两个 TableUpdate() 都成功了则用 SQLCommit() 函数提交事务处理。如果未成功则回滚事务处理。

问题

第一个版本的表单中的三个问题现已解决了两个。可以添加新成员和删除一个成员了。如果违犯了参照完整性删除将会失败。例如,假设你想删除一个没有相关 juveniles 但有未结清的借书的成员时。你会看到图 5 的错误信息。
图 5  删除 Loans 成员时的错误信息

因此,语无伦次的错误信息的问题任然存在。你可以编写代码来分解错误信息并寻找特定的短语。然后将 SQL Server 信息转换为用户可以理解的内容。这是很大的工作量并要求非常熟悉 SQL Server 的错误信息。它也使转换你的应用程序到另一个后端(如 Oracle)变得非常困难。

,使用视图 - 尝试二
相关热词搜索: tag: 数据库教程,sql数据库教程,access数据库教程,oracle数据库教程,电脑教学 - 数据库教程
上一篇:使用视图 - 尝试一
《使用视图 - 尝试二》相关文章
文章评论
联系我们 | 网站地图 | 范文大全 | 管理资料 | 驾照考试 | 教学资料 | 名言大全 | 软件下载
Copyright @ 多问网 all rights reserved
学生评语_教案设计_小学语文试卷
1 2 3 4 5 6 7 8 9 10 11 12