校园银行自助系统

来源:互联网 发布:linux系统排行榜 编辑:程序博客网 时间:2024/06/10 06:12

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

软件设计思路
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       else28       {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     else41     {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       else16       {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         else26         {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       else14       {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         else33         {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       else23       {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         else33         {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       try35       {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         else45         {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           else52           {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的理解,在后面的学习过程中,多实践多练习才是快速掌握知识的正确途径,没有一定代码的积累,是很难成为真正的高手。


<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击