C#与T-SQL 银行转账数据交互设计( 事件,存储过程综合应用)

设计理念
1.所有数据存储比对和存储过程全部交给服务器端
2.前端只做数据提交和判断结果

后端SQL数据库存储过程

create table bank
(
   userId int identity primary key not null,
   userName nvarchar(32) not null,
   userMoney int null,
   check(userMoney >10)
)
go
insert into bank values ('王大力',1000)
insert into bank values ('鲁冠球',2000)
go

create proc TransMoney--创建一个转账存储过程
	@Money int --转账金额
	,@userId_out int--转出账户
	,@userId_in int--转入账户
	,@userName_in nvarchar(32)--转入账户抬头
	,@successFlag int output--是否成功标签1成功,0失败
	as 
	begin
		begin transaction--开始一个事件
			declare @geterror int --捕获错误的变量
			--根据id匹配用户名,如果匹配不成功,将@geterror用于最后的事件回滚
			select @geterror=(select 匹配=case
						   when userName=@userName_in then 0
							else 1
						   end
							from bank where userId=@userId_in)
			--转出账户,
			update bank set userMoney=userMoney-@Money where userId=@userId_out
			set @geterror=@geterror+@@error--捕获错误
			--转入账户,
			update bank set userMoney=userMoney+@Money where userId=@userId_in
			set @geterror=@geterror+@@error--捕获错误
				if(@geterror>0)--捕获到错误
					begin
						set @successFlag=0--设置转账失败标签
						rollback transaction--回滚
					end
				else
					begin
						set @successFlag=1--设置转账成功标签
						commit transaction--提交
					end
	end--proc
	go

前端C#代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace _02_简易转账工具
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            FormatDataGridView1();

        }

        private void FormatDataGridView1()
        {
            string constr = "Data Source=.\\sqlexpress;Initial Catalog=sqldemos;Persist Security Info=True;User ID=sa;password=123456;";
            string sqlstr = "select * from bank";
            DataTable dt = new DataTable();
            using (SqlDataAdapter adapter = new SqlDataAdapter(sqlstr, constr))
            {
                adapter.Fill(dt);
            }
            dataGridView1.DataSource = dt;
        }

        private int _money;//金额
        private int _userIdOut;//转出账户
        private int _userIdIn;//转入账户
        private string _nameIn;//转入账户姓名
        //           @Money int --转账金额
        //,@userId_out int--转出账户
        //,@userId_in int--转入账户
        //,@userName_in nvarchar(32)--转入账户抬头
        //@successFlag int output--是否成功标签1成功,0失败
        private void button2_Click(object sender, EventArgs e)
        {
            //从前端获取数据
            try
            {
                this._money = Convert.ToInt32(txtMoney.Text);
                this._nameIn = this.txtInName.Text.Trim();
                this._userIdIn = Convert.ToInt32(this.txtInId.Text);
                this._userIdOut = Convert.ToInt32(this.txtOutId.Text);

            }
            catch (Exception f)
            {
                MessageBox.Show("数据录入有错:" + f.Message);
            }
              //开启SQL转账存储过程
            string sql = "TransMoney";
            //string constr = "Data Source=.\\sqlexpress;Initial Catalog=sqldemos;Persist Security Info=True;User ID=sa;password=123456;";
            //初始化 pms
            SqlParameter[] pms = new SqlParameter[]
                {
                    new SqlParameter("@Money",SqlDbType.Int){ Value=this._money },
                    new SqlParameter("@userId_out",SqlDbType.Int){ Value=this._userIdOut },
                    new SqlParameter("@userId_in",SqlDbType.Int){ Value=this._userIdIn },
                    new SqlParameter("@userName_in",SqlDbType.NVarChar,32){ Value=this._nameIn },
                    new SqlParameter("@successFlag",SqlDbType.Int){Direction=ParameterDirection.Output }

                };
            //提交存储过程
            _07城市列表和递归Treeview.SqlHelper.ExecuteNonQueryForProc(sql, pms);
               int successFlage=  (int)pms[4].Value;//获取转账成功的标签
            //判断转账是否成功
            if (successFlage == 1)
            {
                MessageBox.Show("转账成功");
            }
            else
            {
                MessageBox.Show("转账失败");
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            FormatDataGridView1();
        }
    }
}

发布了55 篇原创文章 · 获赞 4 · 访问量 1415

猜你喜欢

转载自blog.csdn.net/BowenXu11/article/details/104764060