设计理念
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();
}
}
}