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

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

  <省略的代码>

  IF RECCOUNT("c_member") = 0

  RETURN 0

  ELSE

  cmemberinfo = ALLTRIM(THIS.convert(c_member.firstname)) + ; +

  cdelimiter + ;

  ALLTRIM(THIS.convert(c_member.middleinitial)) + ;

  cdelimiter + ;

  ALLTRIM(THIS.convert(c_member.lastname)) + ;

  cdelimiter + ;

  ALLTRIM(THIS.convert(c_member.street)) + ;

  cdelimiter + ;

  ALLTRIM(THIS.convert(c_member.city)) + cdelimiter + ;

  ALLTRIM(THIS.convert(c_member.state)) + ;

  cdelimiter + ;

  ALLTRIM(THIS.convert(c_member.zip)) + cdelimiter + ;

  ALLTRIM(THIS.convert(c_member.phone_no)) + ;

  cdelimiter + ;

  ALLTRIM(THIS.convert(c_member.expr_date)) + ;

  cdelimiter + ;

  ALLTRIM(THIS.convert(c_member.birth_date)) + ;

  cdelimiter + ;

  ALLTRIM(THIS.convert(c_member.adult_member_no)) + ;

  cdelimiter

  RETURN RECCOUNT("c_member")

  ENDIF

  添加一个Adult

  OLE 服务程序的 AddMember 方法用于添加一个成员到库中. 为了易于使用该方法使用一个两维数组作为参数. 第一列包含字段名第二行包含相关信息. 表单的 AddMember 方法在 Save 按钮的 Click 事件中调用并依次调用OLE 服务程序的 GetMember 方法.

  DIMENSION lamember[11,2]

  lamember[1,1] = "firstname"

  lamember[2,1] = "middleinitial"

  lamember[3,1] = "lastname"

  lamember[4,1] = "street"

  lamember[5,1] = "city"

  lamember[6,1] = "state"

  lamember[7,1] = "zip"

  lamember[8,1] = "phone_no"

  lamember[9,1] = "expr_date"

  lamember[10,1] = "birth_date"

  lamember[11,1] = "adult_member_no"

  * 一些数据保留为空或被服务器改写

  lamember[1,2] = ALLTRIM(THISFORM.txtfirstname.value)

  lamember[2,2] = ALLTRIM(THISFORM.txtmiddleinitial.value)

  lamember[3,2] = ALLTRIM(THISFORM.txtlastname.value)

  lamember[4,2] = ALLTRIM(THISFORM.txtstreet.value)

  lamember[5,2] = ALLTRIM(THISFORM.txtcity.value)

  lamember[6,2] = ALLTRIM(THISFORM.txtstate.value)

  lamember[7,2] = ALLTRIM(THISFORM.txtzip.value)

  lamember[8,2] = ALLTRIM(THISFORM.txtphonenumber.value)

  IF THISFORM.olibrary.addmember(@lamember) < 0

  lcmessage = THISFORM.olibrary.lasterrdesc

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

  mb_iconinformation)

  ELSE

  = MESSAGEBOX("This member has been added.", mb_iconinformation)

  * 找到新成员的 member_no

  THISFORM.txtmemberid.value = ALLTRIM(STR(THISFORM.olibrary.newid))

  <省略的代码>

  数组的第一列 laMember 包含字段的名字. 第二列包含被表单上的控件使用的实际的数据. 数组按引用传递以确保它到达 AddMember 方法, 如果成员成功地添加了 AddMember 返回 1否则返回 -1. 如果添加不成功, OLE 服务程序的 LastErrDesc 属性包含错误信息.

  OLE 服务程序的 AddMember 方法

  正如上面所提及, OLE 服务程序的 AddMember 方法接受一个参数, 一个字段名和值的数组.

  LParameters aMemberInfo

  添加一个成员到图书馆数据库是一个两步过程. 首先一个新的包括成员名字的记录添加到 Member 表. 该表中的 member_no 字段已经分派了 Identity 属性且 SQL Server 自动决定下一个要使用的值. 其次是添加一个相应的包含成员地址的记录到 Adult 表. 相同的 member_no 必须两个表中以维护一对一的关系.

  两步都需要成为事务处理的一部分, 因此要么两个表的记录都可以正确地加入到表中, 要么都不加入进去.

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

  接着, 一条针对于 Member 表的Insert 语句被生成并发送到 SQL Server. 如果 Insert 失败则回滚事务处理且 AddMember 方法返回-1, 提示用户插入失败.

  csql = "Insert member (firstname, middleinitial, lastname, " + ;

  "photograph) " + ;

  "values ('" + ALLTRIM(amemberinfo[1,2]) + "', " + ;

  "'" + ALLTRIM(amemberinfo[2,2]) + "', " + ;

  "'" + ALLTRIM(amemberinfo[3,2]) + "', " + ;

  "null)"

  IF sqlexec(THIS.nhandle, csql) < 0

  THIS.seterror

  * 回滚事务处理

  = SQLROLLBACK(THIS.nhandle)

  RETURN -1

  ENDIF

  SQL Server 的全局变量 @@Identity 保存着最近插入到 Identity 列的值. 在此情况下它包含着新的用户的 member_no. 该数值保存在 OLE server 的 NewID 属性中.

  IF sqlexec(THIS.nhandle, "Select @@identity") < 0

  THIS.seterror

  *回滚事务处理

  = SQLROLLBACK(THIS.nhandle)

  RETURN -1

  ENDIF

  THIS.newid = sqlresult.EXP

  接着, 添加Adult 表中的相关记录. member_no 的值来自 @@Identity. 正如前面所说, 如果插入失败, 回滚整个事务处理且AddMember 返回-1.

  csql = "Insert adult (member_no, street, city, state, zip, " + ;

  "phone_no, expr_date) " + ;

  "values (" + ALLTRIM(STR(THIS.newid)) + ", " + ;

  "'" + ALLTRIM(amemberinfo[4,2]) + "', " + ;

  "'" + ALLTRIM(amemberinfo[5,2]) + "', " + ;

  "'" + ALLTRIM(amemberinfo[6,2]) + "', " + ;

  "'" + ALLTRIM(amemberinfo[7,2]) + "', " + ;

  "'" + ALLTRIM(amemberinfo[8,2]) + "', " + ;

  "'" + TTOC(DTOT(GOMONTH(DATE(),12))) + "' )"

  IF sqlexec(THIS.nhandle, csql) < 0

  THIS.seterror

  * 回滚事务处理

  = SQLROLLBACK(THIS.nhandle)

  RETURN -1

  ENDIF

  最后一步是试着提交事务处理. 如果失败, 回滚一切东西. 如果提交成功, 新的成员已经添加且 AddMember 返回 1, 指明操作成功.

  IF SQLCOMMIT(THIS.nhandle) < 0

  THIS.seterror

  * Rollback the transaction

  = SQLROLLBACK(THIS.nhandle)

  RETURN -1

  ELSE

  RETURN 1

  ENDIF

  保存修改

  表单的 UpdateMember 方法调用 OLE server 的 UpdateMember 方法. 表单传递到 OLE server 一个二维数组和成员的 ID. 如同上面的 AddMember 方法一样, 数组的第一列包含要更新的字段名, 第二列包含一个特定成员的新信息.

  当一个成员添加后, 数组中包括记录中的各字段. 但在此情况下, 它将只包含字段值被修改了的记录. 没有办法让 SQL Server 更新没有修改的信息.

  表单搜索各控件来看它的值是否被修改. 如果是, 添加一行到数组中. 注意使用了 OldVal() 来查看字段的值是否改变了. 使用缓存了的游标使这样做成为可能.

  i = 0

  IF c_member.firstname <> OLDVAL("c_member.firstname")

  i = i + 1

  DIMENSION lamember[i, 2]

  lamember[i,1] = "firstname"

  lamember[i,2] = ALLTRIM(THISFORM.txtfirstname.value)

  ENDIF

  IF c_member.lastname <> OLDVAL("c_member.lastname")

  i = i + 1

  DIMENSION lamember[i, 2]

  lamember[i,1] = "lastname"

  lamember[i,2] = ALLTRIM(THISFORM.txtlastname.value)

  ENDIF

视频学习

我考网版权与免责声明

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

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

最近更新

社区交流

考试问答