既然是模拟就简单多了。“转账”就是把一个账户的钱减掉,加到另一个账户上。因为用户/商家和银行账户是分开的表,需要做表连接查询。
因为不知道你用什么数据库,连接数据库的就不写了。用户,银行和商家3模块在当前情况下就是数据库的3张表:其关键字段如下:
用户表:手机号、卡号(银行账户的卡号)
商家表:商家编号、卡号(银行账户的卡号)
银行帐户:卡号、账户余额
Dim cnn as New ADODB.Connection
Dim rst as New ADODB.Recordset
Dim rsAccount as New ADODB.Recordset
'初始化变量cnn,连接数据库
'查询余额。查询手机号”12345678900"的用户的余额。这里默认一个手机号对应一个账户
rst.Open "select 账户余额 from 银行账户 join 用户表 on 银行账户.卡号=用户表.卡号 where 用户表.手机号='"12345678900'", cnn, adOpenForwardOnly, adLockReadOnly, adCmdText
if rst,Recordcount=0 then
msgbox '该手机对应的卡号不存在!"
else
'显示余额 rst.Fields("账户余额")
end if
rst.close
'支付转账,从用户A(手机12345678900)转500到商家B(编号222)
‘转出
rst.Open "select 银行账户.卡号 from 银行账户 join 用户表 on 银行账户.卡号=用户表.卡号 where 用户表.手机号='12345678900', cnn, adOpenForwardOnly, adLockReadOnly, adCmdText
if rst.Recordcount=0 then
'手机号不存在或者卡号不存在
else'修改余额
rsAccount.Open "select 账户余额 from 银行账户 where 卡号='" &rst.Fields("卡号") &"'",cnn, adOpenKeyset, adLockOptimistic, adCmdText
rsAccount.Fields("账户余额")=rsAccount.Fields("账户余额")-500
rsAccount.Update
rsAccount.close
end if
’转入。同样默认一个商家编号对应一个银行账户。
rst.Open "select 银行账户.卡号 from 银行账户 join 商家表 on 银行账户.卡号=商家表.卡号 where 商家表.编号='222', cnn, adOpenForwardOnly, adLockReadOnly, adCmdText
if rst.Recordcount=0 then
'账户不存在或者编号不存在
else'修改余额
rsAccount.Open "select 账户余额 from 银行账户 where 卡号='" &rst.Fields("卡号") &"'",cnn, adOpenKeyset, adLockOptimistic, adCmdText
rsAccount.Fields("账户余额")=rsAccount.Fields("账户余额")+500
rsAccount.Update
rsAccount.close
end if
以上代码未优化,就是个大概方法,一些细节需要自己完善,比如余额不足时的处理,比如用户已经转出,在转入商家时出错时的处理。
通常在实际转账系统中需要保证转出和转入全部完成,其中有一个出错就取消整个 *** 作。用 cnn的下列方法发起一个数据库事务(当然看你老师的要求,要求不高的可以忽视):
cnn.BeginTrans 开始事务。在对余额修改前调用。
cnn.CommitTrans 提交事务。在对余额修改完成后调用(注意是转出、转入都完成时)。
cnn.RollbackTrans 撤销事务。通常在错误处理程序里用,取消之前对记录所做的修改。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)