用vfp建立3层客户服务器程序

来源:计算机等级考试    发布时间:2012-08-28    计算机等级考试视频    评论

  <省略的代码>

  IF no FIELDS were changed, there IS nothing TO DO AND therefore no POINT IN bothering SQL SERVER.

  IF i = 0

  = MESSAGEBOX("没有要保存的东西.", mb_iconinformation)

  RETURN

  ENDIF

  如果有被修改了的字段, 表单调用 OLE server 的 UpdateMember 方法. 向它传递数组及成员的 ID. 如果 UpdateMember 返回 -1 则更新失败并显示失败的原因给用户.

  IF THISFORM.olibrary.updatemember(@lamember, ;

  THISFORM.txtmemberid.value)<0

  lcmessage = THISFORM.olibrary.lasterrdesc

  = MESSAGEBOX(SUBSTR(lcmessage, RAT(']',lcmessage)+1), ;

  mb_iconinformation)

  ELSE

  = MESSAGEBOX("该成员信息已保存.", mb_iconinformation)

  <省略的代码>

  OLE 服务程序的UpdateMember 方法

  正如前面所提及, OLE server 的 UpdateMember 方法接受两个参数, 字段名和数据数组及要更新的成员的ID.

  LParameters aMemberInfo, cSearchID

  就象添加一个成员一样, 要求两个插入语句封装到一个事务处理中, 更新一个成员要求两个 Update 封装在一个事务处理中. 要创建各 Update 语句, UpdateMember 搜索数组中的各字段. 例如, 如果在数组中找到"firstname" 且它是在第一列, Member 表中的 firstname 字段将被更新. 构造两个串, cSQL1 和 cSQL2, 各串包含一部分 Update 语句.

  csql1 = ""

  npos = ASCAN(amemberinfo, "firstname")

  IF MOD(npos, 2) = 1

  csql1 = csql1 + "firstname = '" + amemberinfo[nPos + 1] + "', "

  ENDIF

  npos = ASCAN(amemberinfo, "lastname")

  IF MOD(npos, 2) = 1

  csql1 = csql1 + "lastname = '" + amemberinfo[nPos + 1] + "', "

  ENDIF

  <省略的代码>

  csql2 = ""

  npos = ASCAN(amemberinfo, "street")

  IF MOD(npos, 2) = 1

  csql2 = csql2 + "street = '" + amemberinfo[nPos + 1] + "', "

  ENDIF

  npos = ASCAN(amemberinfo, "city")

  IF MOD(npos, 2) = 1

  csql2 = csql2 + "city = '" + amemberinfo[nPos + 1] + "', "

  ENDIF

  然后开始一个事务处理.

  = SQLSetProp(This.nHandle, "Transactions", 2)

  如果所有东西都保存到变量 cSQL1 中, 接着更新成员表的 Update 语句被创建且传递到 SQL Server. 如果失败则回滚事务处理.

  IF LEN(csql1) > 0

  * Add the Update, strip off the last comma, add a Where clause

  csql1 = "Update member Set " + LEFT(csql1, LEN(csql1) - 2) + ;

  "where member_no = " + ALLTRIM(csearchid)

  IF sqlexec(THIS.nhandle, csql1) < 0

  THIS.seterror

  * 回滚事务处理

  = SQLROLLBACK(THIS.nhandle)

  RETURN -1

  ENDIF

  ENDIF

  同样, 如果所有东西已经保存到变量 cSQL2 中, 接着创建更新 Adult 表的 Update 语句并传递到 SQL Server. 如果失败则回滚事务处理.

  IF LEN(csql2) > 0

  * 添加 Update, 去掉最后的逗号, 添加一个Where 子句

  csql2 = "Update adult Set " + LEFT(csql2, LEN(csql2) - 2) + ;

  "where member_no = " + ALLTRIM(csearchid)

  IF sqlexec(THIS.nhandle, csql2) < 0

  THIS.seterror

  * 回滚事务处理

  = SQLROLLBACK(THIS.nhandle)

  RETURN -1

  ENDIF

  ENDIF

  最后一步是提交事务处理. 如果提交失败则回滚事务处理.

  IF SQLCOMMIT(THIS.nhandle) < 0

  THIS.seterror

  * 回滚事务处理

  = SQLROLLBACK(THIS.nhandle)

  RETURN -1

  ELSE

  RETURN 1

  ENDIF

  删除一个成员

  OLE Server 的 RemoveMember 方法用于删除一个成员. 该方法接受一个参数:要删除的成员的 ID. 如果删除成功 RemoveMember 返回 1 否则返回 -1, OLE server 的属性 LastErrDesc 包含着失败的理由. 如果违反了参照完整性删除将会失败, 例如一个未清借出或活动的少年的成员是不能被删除的. 也可能因为SQLExec() 执行失败而造成删除失败. 无论是什么原因造成删除失败, 表单代码从 oLibrary.LastErrDesc 获取失败原因并可以显示给用户.

  IF THISFORM.olibrary.removemember(THISFORM.txtmemberid.value) < 0

  lcmessage = THISFORM.olibrary.lasterrdesc

  = MESSAGEBOX(SUBSTR(lcmessage, RAT(']',lcmessage)+1), ;

  mb_iconinformation)

  ELSE

  = MESSAGEBOX("成员已经删除.", mb_iconinformation)

  <省略的代码>

  OLE 服务程序的 RemoveMember 方法

  OLE server 的 RemoveMember 方法接受一个参数, 想要删除的成员的成员 ID.

  LParameters cSearchID

  有多种理由会使删除失败. 以这进而使用的数据来说最通常的原因是成员有未结清的借书或是一个活动的少年的保证人. 如果其中任一理由为真则删除将失败.

  RemoveMember 方法代码可以写来试着删除并查看是否因为这两个理由失败来看监视删除的失败. 但这样做的效率不高, 特别是在要首先检查比较这两个条件时. 如果成员未结清借书或是一个少年的保证人则没必须尝试删除. 这样做更容易捕捉错误并节约 SQL Server 上的处理.

  * 首先检查该成员是否还有未还清的借书

  csql = "Select member_no From loan Where member_no = " + ;

  ALLTRIM(csearchid)

  IF sqlexec(THIS.nhandle, csql) < 0

  THIS.seterror

  RETURN -1

  ELSE

  IF RECCOUNT("sqlresult") <> 0

  THIS.lasterrdesc = "该成员不能删除. " + ;

  "他/她还有借书未还清."

  RETURN -1

  ENDIF

  ENDIF

  * 现在检查这是不是一个活动的少年的保证人

  csql = "Select member_no From juvenile Where adult_member_no = " + ;

  ALLTRIM(csearchid)

  IF sqlexec(THIS.nhandle, csql) < 0

  THIS.seterror

  RETURN -1

  ELSE

  IF RECCOUNT("sqlresult") <> 0

  THIS.lasterrdesc = "该成员不能删除. " + ;

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答