sql事务的调用

时间:2021-10-05 05:23:32

一、数据库的SQL

USE [Text]
GO
/****** Object: StoredProcedure [dbo].[mon] Script Date: 2017-01-03 15:59:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[mon]

@toID int, --接收转账的账户

@fromID int , --转出自己的账户

@momeys money, --转账的金额

@back int output,--返回值

@frommomeys money output,--转出方金额

@tomomeys money output--接收方金额

as

begin tran --开始执行事务

update bb set moneys=moneys-@momeys where ID=@fromID --执行的第一个操作,转账出钱,减去转出的金额

select @frommomeys=moneys from bb where ID=@fromID--转出后金额

update bb set moneys=moneys+@momeys where ID=@toID --执行第二个操作,接受转账的金额,增加

select @tomomeys=moneys from bb where ID=@toID--转出后金额

if @@error<>0 --判断如果两条语句有任何一条出现错误

begin rollback tran --开始执行事务的回滚,恢复的转账开始之前状态

set @back=1 --返回1失败
return

end

else --如何两条都执行成功

begin commit tran 执行这个事务的操作

set @back=0 --返回0成功
return

end

二、事务调用

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

namespace SQL事务
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=.;database=Text;uid=sa;pwd=123456"); //连接字符串

SqlCommand cmd = new SqlCommand("mon", con); //调用存储过程

cmd.CommandType = CommandType.StoredProcedure;

con.Open();

SqlParameter prar = new SqlParameter();//传递参数

cmd.Parameters.AddWithValue("@fromID", textBox2.Text);

cmd.Parameters.AddWithValue("@toID", textBox3.Text);

cmd.Parameters.AddWithValue("@momeys", Convert.ToInt32(TextBox1.Text));

cmd.Parameters.Add("@back", SqlDbType.Int).Direction = ParameterDirection.Output;

cmd.Parameters.Add("@frommomeys", SqlDbType.Money).Direction = ParameterDirection.Output;

cmd.Parameters.Add("@tomomeys", SqlDbType.Money).Direction = ParameterDirection.Output;

cmd.ExecuteNonQuery();

string value = cmd.Parameters["@back"].Value.ToString();//把返回值赋值给value

from_money.Text =Convert.ToInt32(cmd.Parameters["@frommomeys"].Value).ToString();//获取转方剩余金额

to_money.Text = Convert.ToInt32(cmd.Parameters["@tomomeys"].Value).ToString();//获取到方金额

if (value == "0")
{

Label1.Text = "添加成功";

}

else
{

Label1.Text = "添加失败";

}
}

private void button2_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"Data Source=.;database=Text;uid=sa;pwd=123456");

con.Open();

SqlTransaction tran = con.BeginTransaction();//先实例SqlTransaction类,使用这个事务使用的是con 这个连接,使用BeginTransaction这个方法来开始执行这个事务

SqlCommand cmd = new SqlCommand();

cmd.Connection = con;

cmd.Transaction = tran;

try
{

//在try{} 块里执行sqlcommand命令,

cmd.CommandText = "update bb set moneys=moneys-'" + Convert.ToInt32(TextBox1.Text) + "' where ID='" + textBox3.Text + "'";

cmd.ExecuteNonQuery();

cmd.CommandText = "update bb set moneys=moneys+'" + Convert.ToInt32(TextBox1.Text) + "' where ID='" + textBox2.Text + "'";

cmd.ExecuteNonQuery();

tran.Commit();//如果两个sql命令都执行成功,则执行commit这个方法,执行这些操作

Label1.Text = "添加成功";

}

catch
{

Label1.Text = "添加失败";

tran.Rollback();//如何执行不成功,发生异常,则执行rollback方法,回滚到事务操作开始之前;

}

}
}
}