您的位置:首页 > 数据库 > Oracle

C#+Oracle:ATM自助取款机开发

2015-07-05 10:48 691 查看
系统的简要描述,主要功能 :通过ATM机,用户可以进行一些基本的功能实现:取款、存款、查询余额、转账、修改账户密码等。

这是一个Winform应用程序,有欢迎界面、登录界面、用户中心界面、注销界面、注册界面、查询余额界面、特定金额取款界面、自定义金额取款界面、存款界面、转账界面等。

首先,我安装的是Oracle11g express版本,并且用system.data.Oracleclient连接,连接字符串如下:

[code]string constring = "data source=XE;user=hr;password=hr;";


并且创建了两张表,一个是记录用户存款、取款、转账的信息表deposit表,另一个是记录用户个人信息表PI。除此之外,在两个表中,分别为主键创建一个序列,通过调用nextval实现主键的自动+1功能。

[code]create table deposit(
D_account int,
D_type nchar(2),
D_money int,
D_time nvarchar2(50),
D_id int,
constraint pk_Deposit primary key(D_id)
)
;
create sequence Deposit_id increment by 1 start with 2
;


[code]create table PI(
P_name nvarchar2(20),
P_idCard nvarchar2(50),
P_password int,
P_address nvarchar2(50),
P_phone nvarchar2(20),
P_account_money int,
P_account int,
P_id int,
constraint fk_PI foreign key(P_id) REFERENCES DEPOSIT(D_id)
)
;

create sequence PI_id increment by 1 start with 2
;


在注册界面中,关于限制用户输入,我选择的是正则表达式。比如,用户名为两位汉字、***为18位数字等。

[code]#region     规定输入规则
            if (textBox1.Visible!=Regex.IsMatch(textBox1.Text,"^[\u4E00-\u9FA5]{2,}$"))
            {
                textBox1.Visible = true;
                MessageBox.Show("姓名必须是两个汉字,请重新输入!");
                textBox1.Text = "";
                textBox1.Focus();
                return;
            }
            if (textBox2.Visible != Regex.IsMatch(textBox2.Text, @"^\d{18}$"))
            {
                textBox2.Visible = true;
                MessageBox.Show("***号必须为18位数字,请重新输入");
                textBox2.Text = "";
                textBox2.Focus();
                return;
            }
            if(textBox3.Visible!=Regex.IsMatch(textBox3.Text,@"^\d{6}$"))
            {
                textBox3.Visible = true;
                MessageBox.Show("密码必须是6位数字,请重新输入。");
                textBox3.Text = "";
                textBox3.Focus();
                return;
            }           

            if(textBox5.Visible!=Regex.IsMatch(textBox5.Text,@"^\d{6,}$"))
            {
                textBox5.Visible = true;
                MessageBox.Show("电话至少是6位数字,请重新输入!");
                textBox5.Text = "";
                textBox5.Focus();
                return;
            }

            double Open_accounts = Convert.ToDouble(textBox6.Text);
            if(Open_accounts<100)
            {
                MessageBox.Show("开户金额不能少于100,请重新输入!");
                textBox6.Text = "";
                textBox6.Focus();
                return;
            }
            #endregion


以及验证用户是否已经注册过,通过检查PI表中的帐号是否存在。

[code]            #region 检查用户是否注册
            //检查用户是否已注册
            string constring = "data source=XE;user=hr;password=hr;";
            OracleConnection conn = new OracleConnection(constring);
            OracleCommand com = conn.CreateCommand();
            conn.Open();
            com.CommandText = "SELECT * from PI where P_account="+textBox7.Text;
            OracleDataReader odr = com.ExecuteReader();
            if (odr.HasRows)
            {
                    MessageBox.Show("此账户已注册,请重新选号!");
                    textBox1.Text = "";
                    textBox1.Focus();
                    return;
             }
            else
            {
                OracleConnection conn1 = new OracleConnection(constring);
                conn1.Open();

                   string kk = DateTime.Now.ToString("yyyy-MM-dd"); 
                   OracleCommand com2 = conn.CreateCommand();
                   com2.CommandText = "insert into deposit values('"
                      + textBox7.Text + "','"
                      + '存' + "','"
                      + textBox6.Text + "','"
                      + kk + "',deposit_id.nextval)";                                
                   OracleCommand com1 = conn.CreateCommand();
                   com1.CommandText = "insert into PI values('"+ 
                       textBox1.Text + "','"+ 
                       textBox2.Text + "','"+ 
                       textBox3.Text + "','"+ 
                       textBox4.Text + "','"+ 
                       textBox5.Text + "','"+ 
                       textBox6.Text + "','"+ 
                       textBox7.Text + "',PI_id.nextval)";                                                                       
                   try
                   {   
                      com2.ExecuteNonQuery();
                      com1.ExecuteNonQuery();
                       conn.Close();
                       MessageBox.Show("注册成功");
                   }
                    catch (Exception ee)
                   {
                       MessageBox.Show(ee.Message,"提示");
                      return;
                    }             
            }           
            #endregion


在登录界面中,只需要帐号和密码是否于PI表中的帐号、密码匹配即可。除此之外还定义了一个全局变量,用于保存正确输入帐号,方便之后相关界面的调用。

在注销界面中,也只需要验证账户、密码是否与PI表中的帐号、密码相匹配即可。

在个人中心页面,主要就是几个按钮控件,用于跳转到相关事务操作界面中。

在查询余额界面,通过查找数据库中PI表中PI_account_money字段中的值,赋值与一个lable控件的text值,显出出来即可。

在取款界面中,通过执行select语句、update语句、insert语句,实现,PI表中PI_account_money字段的及时更新、deposit表中添加取款信息:

[code] "select P_account_money from PI where P_account=" + account;
 "update PI set P_account_money=P_account_money-"+textBox1.Text+" where P_account='" + account + "'";
  "insert into deposit values('" + account + "','" + '取' + "','"+textBox1.Text+ "','" + kk + "',Deposit_id.nextval)";


存款功能的实现与取款功能相似。

在转账界面中,首先确定转账帐号是否存在,且转账金额不能低于用户账户中的金额。其次,转账成功后要及时更新数据中的两张表。

[code]string constring = "data source=XE;user=hr;password=hr;";
            OracleConnection conn = new OracleConnection(constring);
            OracleCommand com = conn.CreateCommand();
            OracleCommand com4 = conn.CreateCommand();
            conn.Open();
            com.CommandText = "select P_account_money from PI where P_account='" + textBox1.Text + "'";
            string D_s = Login.s;
            com4.CommandText = "select P_account_money from PI where P_account=" +D_s;
            string kk = DateTime.Now.ToString("yyyy-MM-dd");           
            decimal money = (decimal)com4.ExecuteScalar();
            money = Convert.ToInt32(money);
            try
            {

                OracleDataReader odr = com.ExecuteReader();
                if (money >= Convert.ToInt32(textBox2.Text))
                {
                    if (odr.HasRows)
                    {
                        OracleCommand com1 = conn.CreateCommand();
                        OracleCommand com2 = conn.CreateCommand();
                        OracleCommand com3 = conn.CreateCommand();
                        com1.CommandText = "update PI set P_account_money=P_account_money+'" + textBox2.Text + "' where P_account='" + textBox1.Text + "'";
                        com2.CommandText = "update PI set P_account_money=P_account_money-'" + textBox2.Text + "' where P_account='" + D_s + "'";
                        com3.CommandText = "insert into deposit values('" + D_s + "','" + '转' + "','" + textBox2.Text + "','" + kk + "',Deposit_id.nextval)";
                        com1.ExecuteNonQuery();
                        com2.ExecuteNonQuery();
                        com3.ExecuteNonQuery();

                        MessageBox.Show("转账成功!");
                        conn.Close();
                    }
                    else
                    {
                        MessageBox.Show("此用户不存在");
                        textBox1.Text = "";
                        textBox1.Focus();
                    }
                }
                else
                {
                    MessageBox.Show("余额不足!");
                }
            }
            catch(Exception ee)
            {
                MessageBox.Show(ee.Message);
                return;
            }


以下是程序运行截图:































这个程序的实现很简单,用到的相关知识也没有难度,最后我还添加了一个管理员功能,用于显示两个表。

相关代码以上传。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: