校园银行自助系统

这几天由于要交数据库课程设计,就做了一个校园自助银行系统。由于经验不多,系统做的比较简单,没有用三层结构,一些数据库的操作就在用户层实现了。以下是这个系统的所有代码:

软件设计思路
1、 首先建立一个登陆界面,然后做主界面,主界面有以下5个功能:取款,存款,转账,转账,信息查询及历史账单查询,修改密码

2、 在写数据连接代码时,我写了一个SqlHelper类,具体代码如下

 1 public class SqlHelper

 2 {

 3   //连接数据库的字符串

 4   static string connStr = @"Data Source=zhao\SQLEXPRESS;Initial Catalog=校园自助银行系统;Integrated Security=True";

 5   //返回一个表

 6   public static DataTable ExecuteDataTable(string sql, params SqlParameter[] param)

 7   {

 8     DataTable dt = new DataTable();

 9     using (SqlConnection conn = new SqlConnection(connStr))

10     {

11       conn.Open();

12       using (SqlCommand cmd = new SqlCommand(sql, conn))

13 

14       {

15         if (param != null)

16         {

17           cmd.Parameters.AddRange(param);

18         }

19         SqlDataAdapter sad = new SqlDataAdapter(cmd);

20         sad.Fill(dt);

21       }

22     }

23     return dt;

24   }

25   //执行增删改

26   public static int ExecuteNonQuery(string sql, params SqlParameter[] param)

27   {

28     int result = -1;

29     using (SqlConnection conn = new SqlConnection(connStr))

30     {

31       conn.Open();

32       using (SqlCommand cmd = new SqlCommand(sql, conn))

33       {

34         if (param != null)

35         {

36           cmd.Parameters.AddRange(param);

37         }

38         result = cmd.ExecuteNonQuery();

39       }

40     }

41     return result;

42   }

43 

44   //获取登录用户的信息

45   public static DataRow GetDataRow()

46   {

47     DataTable dt = SqlHelper.ExecuteDataTable("select * from 账户信息 where CardNumber=@cardnumber", new SqlParameter("@cardnumber",        UserCardInfo.usercardinfo));

48     DataRow dr = dt.Rows[0];

49     return dr;

50 

51   }

52 }

 

在以后的对数据库操作的过程中,都是使用以上类中的方法

3、在做登录界面前,先在主界面使用以下代码,在软件运行时,先弹出登录界面
  

1 Login login = new Login();     //Login是登录对话框

2 login.ShowDialog();

 


在进入登录界面时,我先定义一个随机数,用于验证码功能的实现
  

1 Random r = new Random();

2 lblYanZheng.Text = r.Next(1000, 9999).ToString();     //验证码的范围是1000到9999

 


以下代码是具体的登录代码
  

 1 int count = 3;

 2   private void btnLogin_Click(object sender, EventArgs e)

 3   {

 4     //记录银行卡号

 5     string cardnumber = txtCardNumber.Text;

 6     //记录登录密码

 7     string secret = txtCardSecret.Text;

 8     //查询数据库中是否有相对应的用户

 9     string sqlstr = "select * from 账户信息 where CardNumber=@cardnumber and Secret=@secret";

10     DataTable dt = SqlHelper.ExecuteDataTable(sqlstr, new SqlParameter("@cardnumber", cardnumber), new SqlParameter("@secret", secret));

11     //如果查询结果大于0个,则表示有该用户

12     if (dt.Rows.Count > 0)

13     {

14       //如果验证码正确,则允许登录

15       if (txtYanZheng.Text == lblYanZheng.Text)

16       {

17         //用用户信息类的usercardinfo变量保存银行卡号

18         UserCardInfo.usercardinfo = cardnumber;

19         //选中查询结果的第一行

20         DataRow dr = dt.Rows[0];

21         DataTable dtUser = SqlHelper.ExecuteDataTable("select * from 用户 where CardNumber=@cardnumber", new SqlParameter("@cardnumber", cardnumber));

22         DataRow drUser = dtUser.Rows[0];

23         UserCardInfo.name = drUser["Name"].ToString();

24         //登录成功后,关闭登录对话框

25         this.Close();

26       }

27       else

28       {

29         //如果验证码,则计数器递减

30         count--;

31         if (count <= 0)

32         {

33           MessageBox.Show("密码输错次数过多,程序即将退出");

34           System.Environment.Exit(0);

35         }

36         ShowMsg("验证码错误,您还有"+count+"次机会");

37         return;

38       }

39     }

40     else

41     {

42       //如果用户名或密码错误,则计数器递减

43       if (dt.Rows.Count <=0)

44       {

45         count--;

46         if (count <= 0)

47         {

48         MessageBox.Show("密码输错次数过多,程序即将退出");

49         System.Environment.Exit(0);

50         }

51         ShowMsg("银行账号或密码错误,您还有" + count + "次机会");

52         return;

53       }

54       //如果验证码错误

55       else if (txtYanZheng.Text != lblYanZheng.Text)

56       {

57         count--;

58         if (count <= 0)

59         {

60         MessageBox.Show("密码输错次数过多,程序即将退出");

61         System.Environment.Exit(0);

62         }

63       ShowMsg("验证码错误,您还有" + count + "次机会");

64       return;

65       }

66     }

67   }

68 

69   private void btnCancle_Click(object sender, EventArgs e)

70   {

71     //彻底退出程序

72     System.Environment.Exit(0);

73   }

74   void ShowMsg(string msg)

75   {

76     //显示消息

77     MessageBox.Show(msg);

78   }

79 

80   private void Login_Load(object sender, EventArgs e)

81   {

82     //设置将关闭按钮隐藏

83     this.ControlBox = false;

84   }

 

4、进入主界面后
  

 1   //打开取款对话框

 2   private void lblQuKuan_Click(object sender, EventArgs e)

 3   {

 4     QuKuan qck = new QuKuan();

 5     qck.ShowDialog();

 6   }

 7   //打开存款对话框

 8   private void lblCunKuan_Click(object sender, EventArgs e)

 9   {

10     CunKuan qck = new CunKuan();

11     qck.ShowDialog();

12   }

13   //打开转账对话框

14   private void lblZhuanZhang_Click(object sender, EventArgs e)

15   {

16     ZhuanZhang zz = new ZhuanZhang();

17     zz.ShowDialog();

18   }

19   //打开查询个人信息对话框

20   private void lblChaXun_Click(object sender, EventArgs e)

21   {

22     ChaXun cx = new ChaXun();

23     cx.ShowDialog();

24   }

25   //打开修改密码对话框

26   private void lblXiuGai_Click(object sender, EventArgs e)

27   {

28     ChangeSecret cs = new ChangeSecret();

29     cs.ShowDialog();

30   }

31 

32   //欢迎词做跑龙灯运动

33   private void lbltimer_Tick(object sender, EventArgs e)

34   {

35     lblWelcome.Text = lblWelcome.Text.Substring(1) + lblWelcome.Text.First();

36   }

37 

38   private void 切换账户ToolStripMenuItem_Click(object sender, EventArgs e)

39   {

40     //打开登录对话框

41     Login login = new Login();

42     login.ShowDialog();

43 

44     DataTable dt = SqlHelper.ExecuteDataTable("select * from 用户 where CardNumber=@cardnumber", new SqlParameter("@cardnumber",         UserCardInfo.usercardinfo));

45 

46     //更新主界面用户名称

47     DataRow dr = dt.Rows[0];

48     lblUserInfo.Text = dr["Name"].ToString();

49   }

50 

51   private void 安全退出ToolStripMenuItem_Click(object sender, EventArgs e)

52   {

53     //退出应用程序

54     Application.Exit();

55   }

56 

57   private void Form1_Load(object sender, EventArgs e)

58   {

59     //显示登录用户的名称

60     lblUserInfo.Text = "";

61     DataTable dt = SqlHelper.ExecuteDataTable("select * from 用户 where CardNumber=@cardnumber",

                              new SqlParameter("@cardnumber",UserCardInfo.usercardinfo)); 62     DataRow dr = dt.Rows[0]; 63     lblUserInfo.Text = dr["Name"].ToString(); 64   }

 

5、在进入主界面后,我定义了一个类UserCardInfo,里面定义了几个字段,用记录用户信息
  

 1   static class UserCardInfo

 2   {

 3     //保存用户登录的卡号

 4     public static string usercardinfo;

 5     //保存交易时间

 6     public static string time;

 7     //保存交易类型

 8     public static string type;

 9     //保存交易金额

10     public static string money;

11     //保存账户余额

12     public static string remain;

13     //保存用户姓名

14     public static string name;

15   }

 


6、在做存款取款转账功能前,我先写了CunQunKuan类,用于定义存取款转账方法,具体代码如下:
  

 1   static class CunQuKuan

 2   {

 3     //如果b为true,则为取款,否则为转账

 4     public static bool QuKuan(decimal money,bool b)

 5     {

 6       DataRow dr = SqlHelper.GetDataRow();

 7       //先获得当前用户的余额

 8       decimal moneyRemain = decimal.Parse(dr["Money"].ToString());

 9       //如果取款或转账的金额大于账户余额,则失败

10       if (money > moneyRemain)

11       {

12         MessageBox.Show("余额不足,取款失败!");

13         return false;

14       }

15       else

16       {

17         //如果成功,则将余额减去所取的金额

18         moneyRemain -= money;

19         //更新数据库,将该用户的账户余额改为取款后的余额

20         SqlHelper.ExecuteNonQuery("update 账户信息 set Money=@moneyRemain where CardNumber=@cardnumber ", new SqlParameter("@moneyRemain", moneyRemain), 

                                                                  new SqlParameter("@cardnumber", dr["CardNumber"].ToString())); 21         if (b == true) 22         { 23           MessageBox.Show("取款成功!"); 24         } 25         else 26         { 27           MessageBox.Show("转账成功!"); 28         } 29         return true; 30       } 31     } 32 33     //存款的方法 34     public static void CunKuan(decimal money) 35     { 36       DataRow dr = SqlHelper.GetDataRow(); 37       decimal moneyRemain = decimal.Parse(dr["Money"].ToString()); 38       moneyRemain += money; 39       SqlHelper.ExecuteNonQuery("update 账户信息 set Money=@moneyRemain where CardNumber=@cardnumber", new SqlParameter("@moneyRemain", moneyRemain),
                                                                new SqlParameter("@cardnumber", dr["CardNumber"].ToString())); 40       MessageBox.Show("存款成功!"); 41     } 42   }

 

7、在做好以上工作以后,我做了取款功能,代码如下:
    

 1     private void btnOk_Click(object sender, EventArgs e)

 2     {

 3       decimal money = decimal.Parse(txtMoney.Text);

 4       //执行取款操作,并获得返回值,如果返回true,则打印凭证

 5       bool b= CunQuKuan.QuKuan(money, true);

 6       if (b)

 7       {

 8         DialogResult result = MessageBox.Show("是否打印凭条", "打印凭条", MessageBoxButtons.YesNo);

 9         DataRow dr = SqlHelper.GetDataRow();

10         //如果点是,则打印凭证

11         if (result == DialogResult.Yes)

12         {

13           //将标签的文本改为取款信息

14           lblprint.Text = string.Format("卡号:{0}\t\n姓名:{1}\t\n时间:{2}\t\n取款:{3}", dr["CardNumber"].ToString(), UserCardInfo.name, DateTime.Now, money.ToString());

15           //将标签状态改为可视

16           lblprint.Visible = true;

17         }

18         //向交易信息中插入取款记录

19         AddJYInfo.MyMethod(dr,money,"取款");

20       }

21     }

22 

23     private void btnBack_Click(object sender, EventArgs e)

24     {

25       //关闭取款对话框

26       this.Close();

27     }

28 

29     //当窗口加载的时候,显示账户余额

30     private void QuKuan_Load(object sender, EventArgs e)

31     {

32       DataRow dr = SqlHelper.GetDataRow();

33       lblMoneyRemain.Text += dr["Money"].ToString();

34     }

 

8、以下是存款功能代码:
    

 1        private void btnOk_Click(object sender, EventArgs e)

 2     {

 3       //获得输入的存款金额

 4       decimal money = decimal.Parse(txtMoney.Text);

 5       //执行存款程序

 6       CunQuKuan.CunKuan(money);

 7       //返回用户信息所在行

 8       DataRow dr=SqlHelper.GetDataRow();

 9       //想交易信息中添加存款记录

10       AddJYInfo.MyMethod(dr, money, "存款");

11     }

12 

13     private void btnBack_Click(object sender, EventArgs e)

14     {

15       //关闭存款对话框

16       this.Close();

17     }                

 

9、以下是转账代码:
    

 1     private void btnOk_Click(object sender, EventArgs e)

 2     {

 3       decimal money = decimal.Parse(txtMoney.Text);

 4       string receiver = txtReceiver.Text;

 5       //获取转账用户的记录

 6       DataRow dr=SqlHelper.GetDataRow();

 7       //如果转账的金额大于账户余额,则禁止转账

 8       if (money >decimal.Parse(dr["Money"].ToString()))

 9       {

10         MessageBox.Show("余额不足,转账失败!");

11         return;

12       }

13       else

14       {

15         DataTable dt = SqlHelper.ExecuteDataTable("select * from 账户信息 where CardNumber=@receiver", new SqlParameter("@receiver",     receiver));

16         //如果数据库中存在接收转账的用户

17         if (dt.Rows.Count > 0)

18         {

19           DataRow drReceiver = dt.Rows[0];

20           //查询接收转账的用户的金额

21           decimal moneyReceiver = decimal.Parse(drReceiver["Money"].ToString());

22           //接收者的金额加上转的金额

23           moneyReceiver += money;

24           //更新接收转账的用户的金额

25           SqlHelper.ExecuteNonQuery("update 账户信息 set Money=@moneyReceiver where CardNumber=@receiver", new SqlParameter("@moneyReceiver", moneyReceiver),
                                                                    new SqlParameter("@receiver", receiver)); 26           //执行取款方法,false表示弹出的消息框为转账成功 27           CunQuKuan.QuKuan(money,false); 28           dr = SqlHelper.GetDataRow(); 29           //向交易信息中添加转账记录 30           AddJYInfo.MyMethod(dr, money, "转账"); 31         } 32         else 33         { 34           MessageBox.Show("该用户不存在,请核对账户是否正确"); 35           return; 36         } 37       } 38 39     } 40    41 42     private void btnBack_Click(object sender, EventArgs e) 43     { 44       //关闭转账对话框 45       this.Close(); 46     }

 

10、同时,为了记录用户存款取款转账记录,我定义了AddJYInfo类,代码如下:
  

 1   class AddJYInfo

 2   {

 3     //向交易信息表中添加交易信息记录

 4     public static void MyMethod(DataRow dr, Decimal money, string type)

 5     {

 6       //银行卡号

 7       UserCardInfo.usercardinfo = dr["CardNumber"].ToString();

 8       //交易金额

 9       UserCardInfo.money = money.ToString();

10       //交易时间

11       UserCardInfo.time = DateTime.Now.ToString();

12       //交易类型

13       UserCardInfo.type = type;

14       //交易后账户余额

15       UserCardInfo.remain = dr["Money"].ToString();

16       //向数据库中插入交易记录

17       string sql = "insert into 交易记录 (CardNumber,Time,Money,Type,Remain) Values(@usercardinfo, @time,@money,@type,@remain)";

18       SqlHelper.ExecuteNonQuery(sql, new SqlParameter("@usercardinfo", UserCardInfo.usercardinfo), 
                          new SqlParameter("@time", UserCardInfo.time),
                          new SqlParameter("@money", UserCardInfo.money),
                          new SqlParameter("@type", UserCardInfo.type),
                          new SqlParameter("@remain", UserCardInfo.remain)); 19     } 20   }

 

11、接下来是信息查询及历史交易记录查询功能,在做历史交易记录查询功能时,我添加了类AddData,定义了一个根据所选的年份和月份动态添加每个月的天数,代码如下:
  

 1 class AddData

 2   {

 3     public static List<int> AddDay(int year, int month)

 4     {

 5       List<int> list = new List<int>();      

 6       if (month == 1 || month == 3 || month == 5 || month == 7 || month == 9 || month == 11)

 7       {

 8         list.Clear();

 9         for (int i = 1; i <= 31; i++)

10         {

11           list.Add(i);

12         }

13       }

14       else if (month == 4 || month == 6 || month == 8 || month == 10 || month == 12)

15       {

16         list.Clear();

17         for (int i = 1; i <= 30; i++)

18         {

19           list.Add(i);

20         }

21       }

22       else

23       {

24         if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)

25         {

26           list.Clear();

27           for (int i = 1; i <= 29; i++)

28           {

29             list.Add(i);

30           }

31         }

32         else

33         {

34           list.Clear();

35           for (int i = 1; i <= 28; i++)

36           {

37             list.Add(i);

38           }

39         }

40       }

41       return list;

42     }

43   }

 

12、以下是信息查询及历史交易记录查询代码:
    

 1     private void ChaXun_Load(object sender, EventArgs e)

 2     {

 3       //获取该用户信息

 4       DataRow dr = SqlHelper.GetDataRow();

 5       //获得银行卡号

 6       string cardnumber = dr["CardNumber"].ToString();

 7       //将表格控件的数据源绑定

 8       dataGridView.DataSource = SqlHelper.ExecuteDataTable("select * from 用户 where CardNumber=@cardnumber", new SqlParameter("@cardnumber", cardnumber));

 9       //选择起始年份的默认项为下标为0的项

10       cbStartYear.SelectedIndex = 0;

11       //选择截止年份的默认项为下标为0的项

12       cbEndYear.SelectedIndex = 0;

13       //选择起始月份的默认项为下标为5的项

14       cbStartMonth.SelectedIndex = 5;

15       //选择截止月份的默认项为下标为5的项

16       cbEndMonth.SelectedIndex = 5;

17     }

18 

19     private void btnOk_Click(object sender, EventArgs e)

20     {

21       //关闭查询对话框

22       this.Close();

23     }

24 

25     private void btnQuery_Click(object sender, EventArgs e)

26     {

27 

28       int startyear = int.Parse(cbStartYear.SelectedItem.ToString());

29       int startmonth = int.Parse(cbStartMonth.SelectedItem.ToString());

30 

31       int endyear = int.Parse(cbEndYear.SelectedItem.ToString());

32       int endmonth = int.Parse(cbEndMonth.SelectedItem.ToString());

33 

34       try

35       {

36         int startday = int.Parse(cbStartDay.SelectedItem.ToString());

37         int endday = int.Parse(cbEndDay.SelectedItem.ToString());  

38 

39         if (startyear > endyear || (startyear <= endyear && startmonth > endmonth) || (startyear <= endyear && startmonth <= endmonth &&   startday > endday))

40         {

41           MessageBox.Show("请输入正确的查询日期范围");

42           return;

43         }

44         else

45         {

46           DataTable dt = SqlHelper.ExecuteDataTable("select * from 交易记录 where Year(Time)>=@startyear and Year(Time)<=@endyear and Month(Time)>=@startmonth and Month(Time)<=@endmonth and Day(Time)>=@startday and Day(Time)<=@endday and CardNumber=@cardnumber", new SqlParameter("@startyear", startyear),
                                                        new SqlParameter("@endyear", endyear),
                                                        new SqlParameter("@startmonth", startmonth),
                                                        new SqlParameter("@endmonth", endmonth),
                                                        new SqlParameter("@startday", startday),
                                                         new SqlParameter("@endday", endday),
                                                        new SqlParameter("@cardnumber", UserCardInfo.usercardinfo)); 47           if (dt.Rows.Count > 0) 48           { 49             tableHistory.DataSource = dt; 50           } 51           else 52           { 53             tableHistory.DataSource = null; 54             MessageBox.Show("sorry,未查询到相关数据"); 55           } 56         } 57       } 58       catch (Exception) 59       { 60         MessageBox.Show("请选择查询日期"); 61       } 62 63     } 64     //当起始月份的选择项索引发生变化时发生的事件 65     private void cbStartMonth_SelectedIndexChanged(object sender, EventArgs e) 66     { 67       int month = int.Parse(cbStartMonth.SelectedItem.ToString()); 68       int year = int.Parse(cbStartYear.SelectedItem.ToString()); 69       //先清空之前已添加的天数 70       cbStartDay.Items.Clear(); 71       foreach (int item in AddData.AddDay(year, month)) 72       { 73         //向起始天下拉框中添加天数 74         cbStartDay.Items.Add(item); 75       } 76 77     } 78     //当截止月份的选择项索引发生变化时发生的事件 79     private void cbEndMonth_SelectedIndexChanged(object sender, EventArgs e) 80     { 81       int month = int.Parse(cbEndMonth.SelectedItem.ToString()); 82       int year = int.Parse(cbEndYear.SelectedItem.ToString()); 83       cbEndDay.Items.Clear();   84       foreach (int item in AddData.AddDay(year, month)) 85       { 86         cbEndDay.Items.Add(item); 87       } 88 89     }

 

13、最后是修改密码功能,具体代码如下:
    

 1 //设置允许改密码错误的次数

 2     int count = 3;

 3     private void btnOk_Click(object sender, EventArgs e)

 4     {

 5       //或旧密码

 6       string oldpwd = txtOldPwd.Text;

 7       //获得输入的新密码

 8       string newpwd = txtNewPwd.Text;

 9       //获得确认的新密码

10       string newpwd2 = txtNewPwd2.Text;

11       //查询该用户信息

12       DataRow dr = SqlHelper.GetDataRow();

13       //如果输入的旧密码正确和两次输入的新密码都一致,则修改密码成功

14       if (oldpwd == dr["secret"].ToString() && newpwd == newpwd2)

15       {

16         SqlHelper.ExecuteNonQuery("update 账户信息 set Secret=@secret where CardNumber=@cardnumber", new SqlParameter("@secret", newpwd),
                                                                new SqlParameter("@cardnumber", dr["CardNumber"].ToString())); 17         MessageBox.Show("恭喜您,密码修改成功!"); 18       } 19       //如果旧密码错误,则要求重新输入旧密码,如果输错三次,则退出修改密码对话框 20       else if (oldpwd != dr["secret"].ToString()) 21       { 22         MessageBox.Show("原始密码不正确,您还剩" + --count + "次机会"); 23         if (count <= 0) 24         { 25           this.Close(); 26         } 27         return; 28       } 29       //如果两次输入的新密码不一致 30       else if (newpwd != newpwd2) 31       { 32         MessageBox.Show("亲,您的俩次密码不一致哦!再检查一下吧"); 33         return; 34       } 35    36     } 37 38     private void btnCancle_Click(object sender, EventArgs e) 39     { 40       //关闭修改密码对话框 41       this.Close(); 42     }

 

 

最后总结一下做这个系统之后的感受吧,以前学习的时候,不知道为什么别人要定义这个类,为什么这个方法的返回值要是这个类型,其实大可不必纠结这些问题,在自己做的时候,就会发现根据项目的需要,自然而然的需要做这些事情。通过这次实践,更加加深了我对ADO.Net的理解,在后面的学习过程中,多实践多练习才是快速掌握知识的正确途径,没有一定代码的积累,是很难成为真正的高手。

你可能感兴趣的:(系统)