重构-充值和充值记录

来源:互联网 发布:网络兼职诈骗一审 编辑:程序博客网 时间:2024/05/01 18:14

前言

充值窗体真的用了很大的功夫,一些小的细节上的东西总是感觉做的不够好,于是改进了好几遍,接下来听我一一道来。


正文

在设计数据表的时候,把Balance放到了Student_Info表,充值的时候把充值的钱加上原来的余额作为新的余额更新到Student_Info表中,这个道理是很简单的,也很容易实现,真正让我有点为难的是充值记录表。

首先来看一下数据库充值记录表



设计充值记录表的时候想的是,在操作员或学生自己查询充值记录的时候,显示的是每一次充值的钱和充值后的余额。

当时想的很简单啊,直接查询一下充值后的余额就好了,或者充值前查询余额,然后在数据库中加上充值金额更新进去就好啦。直到代码写到DLL层才发现这样行不通的。

DLL层代码如下:

            //把充值记录写入Recharge_Info表            SqlParameter[] sqlParams = {new SqlParameter ("@userID",UserID ),                                        new SqlParameter ("@money",Money ),                                        new SqlParameter ("Operator", Cuser),//操作员名称                                        new SqlParameter ("@Date",DateTime.Now.ToShortDateString()),//定义当前日期                                        new SqlParameter ("@Time",DateTime.Now.ToShortTimeString()),                                       new SqlParameter ("@operation",operation ),//行为 充值                                       new SqlParameter ("@NewBalance",NewBalance)};//NewBalance为充值后的新余额            string sql = @"INSERT INTO Recharge_Info (userID,Recharge,Balance,Date,Time,operation,Operator) VALUES(@userID,@money,@NewBalance,@Date,@Time,@operation,@Operator) ";            int count = sqlHelper.sqlHelper.ExecuteNonQuery(sql, sqlParams);            //更新Student_Info表中余额            SqlParameter[] sqlParams1 = {new SqlParameter ("@Balance",Money )};            string sql1 = @"UPDATE Student_Info set Balance=Balance + @Balance ";            int count1 = sqlHelper.sqlHelper.ExecuteNonQuery(sql1, sqlParams1);            return count;

NewBalance为充值后的余额,NewBalance从哪儿来?

刚开始觉得好麻烦啊,所以先让NewBalance等于充值的金额了,这样的话查询充值记录效果如下:


充值金额和余额一样...

强迫症肯定忍不了这个啊...

于是想在充值完成后再查一下Student_Info表然后把余额再更新到Recharge_Info表

后来一想这样也行不通,Recharge_Info表中是充值记录,一个ID有多条数据,根本不知道更新到哪一条...

所以只能使用另一个办法,在充值前查询当前余额,然后在更新Recharge_Info表时把余额和充值金额加起来形成新的余额插入到表中

//第一次查询余额,然后给充值记录表更新使用        crcs.Facade.QueryFactory cxye = new Facade.QueryFactory();        DataTable yue = cxye.Fcxye(UserID);        string Balance = yue.Rows[0][6].ToString();        //开始充值        crcs.Facade.InsertFancade Recharge = new Facade.InsertFancade();//实例化外观        int Rec = Recharge.FRecharge(UserID, Money, Cuser, Balance);


第一次查询后的余额传值到充值代码中,此处没有使用实体,也给后面改代码带来了很大的麻烦,以后一定要养成一个使用实体的好习惯

然后在BLL层把查询到的旧余额Balance和充值金额Money加起来

这个时候就又遇到了一个问题,由于Balance和Money都是string类型,string类型是字符串型,是不可以直接相加求和的

只好把string类型先转换为int型,然后再相加求和,再次转化为string类型,传值到DLL层进行数据库更新

            int a1 = int.Parse(Money);//把充值金额Money转换为int类型            int a2 = (int)Convert.ToSingle(Balance);//把充值旧余额Balance转换为int类型            int a3 = a1 + a2; //求和            string NewBalance = Convert.ToString(a3);//把新余额转化为String类型
这个时候会发现转换充值金额Moeny和转换旧余额Balance的时候使用的代码不一样

为什么呢?

查询回来的旧余额在数据库中类型是numeric(12, 3)

比如说余额为100块,传回来的值就为100.00

这样使用第一种转化代码就转化不了小数点了

所以使用第二种,转换后int类型也为100,直接砍掉了小数点后数字

如果小数点后为.5等其他金额的话这个时候是要被砍掉的

暂时没有其他的解决方法

希望了解的小伙伴可以提个意见


这样把NewBalance更新到数据库中,在充值记录表中就可以看到余额了



后面四条是调好代码后的效果,已经显示总余额了呢


总结

充值这个界面由于充值记录表,改了很长时间,刚开始由于逻辑上的问题,直到代码写完才发现行不通,由于没有考虑后面添加传值的数据,所以也就没有使用实体,这些都是这次遇到的教训。

通过写这个界面,收获还是很大的。


原创粉丝点击