SQL 事务 (存储过程与事务)

本文详细介绍了C#中执行SQL事务的两种方法:通过存储过程和Transaction,以及SQLServer事务的基本语法和用法。包括创建表、插入数据、使用存储过程进行转账操作,并展示了在C#中调用存储过程实现转账功能的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实例1

C# 执行SQL事务 又两种方法(本人总结的)

1.通过存储过程。 现在就演示一下通过存储过程来执行SQL事务。

2.通过C#中提供的 Transaction 。 

平常我们在sql server里面执行一条insert语句,执行完毕后,我们也没有手动执行commit来提交事务,可是它却将数据插入到数据库中了,这是为什么呢? 答案:那是因为sql server默认是自动提交事务,当你执行一条sql 语句的时候,如果执行成功,它就自动给你commit来提交事务了,如果失败了就自动给你回滚了


SQL Server 事务语法

Sql server 事务的两种用法


<1>创建一个存储过程,

use sales  --指定数据库

create table bb  --创建bb 这个表
(
	ID int not null primary key ,--账号
	Moneys money --转账金额
)

--bb表里插入两条数据
insert into bb values('1',2000)  --账户 1 里有2000元
insert into bb values('2',3000)  --账户 2 里有3000元
go





if(exists(select * from sys.objects where name='proc_bb')) --如果存储这条存储过程存在则先删除
drop  proc Proc_bb
go

create proc Proc_bb  --创建名字为Proc_bb的存储过程 带3个参数
(
	@fromID int,  --转出账户
	@toID int,    --接收转账的账户	
	@momeys money --转账金额
)
as
begin  tran --开始执行事务

update bb set Moneys=Moneys-@momeys where ID=@fromID  ---执行的第一个操作,转账 原来的金额-转账的金额

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

if @@ERROR<>0 --判断  如果两条语句有任何一条出现错误。(如果前面的SQL 语句执行没有错误,则返回0)
begin
rollback tran --开始执行事务的回滚,恢复转账开始之前的状态
return 0
end

else  --如果两个语句都执行成功
begin 
commit tran --执行这个事务的操作
end
go



exec Proc_bb 1,2 ,2000  --执行这条存储过程;  转账账户为 1  接收账户为  2  转账的金额为 2000元


在C#中执行上面这个存储过程

 WebForm2.aspx.cs页面

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data.SqlClient;

namespace 用户激活
{
    public partial class WebForm2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            string connStr=ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    //SqlParameter sqlParameter=new SqlParameter();
                    SqlParameter [] sqlParameters={
                                                     new SqlParameter("@toID",ToID.Text.Trim()),
                                                     new SqlParameter("fromID",FromID.Text.Trim()),
                                                     new  SqlParameter("@money",Money.Text.Trim())
                                                 
                                                 };

                    cmd.CommandText = "exec Proc_bb @toID, @fromID, @money";
                    cmd.Parameters.AddRange(sqlParameters);

                    int i= cmd.ExecuteNonQuery();

                    if (i > 0)
                    {
                        Msg.Text = "转账成功";
                    }
                    else
                    {
                        Msg.Text = "转账失败";
                    }
                    
                }
            }
        }
    }
}

WebForm2.aspx页面

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="用户激活.WebForm2" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    转账账户:<asp:TextBox ID="ToID" runat="server"></asp:TextBox></br>
    接收账户:<asp:TextBox ID="FromID" runat="server"></asp:TextBox></br>
    转账金额:<asp:TextBox ID="Money" runat="server"></asp:TextBox></br>
    转账是否成功:<asp:Label ID="Msg" runat="server" Text=""></asp:Label></br>

    <asp:Button ID="Button1" runat="server" Text="提交转账" onclick="Button1_Click" />
    </form>
</body>
</html>


================================================================
实例2
首先在数据库建立一个表,表名为bank,并插入了两句数据

现在给这个bank表的balance列添加一个约束,规定balance列的值必须大于10
alter table bank
add  constraint  ck_balance check(balance >10)
好了,那现在我们来手动开启一个事务,模拟转账
begin tran  --手动开启一个事务
declare @sumErrors int=0 --声明一个变量,给它赋初始值为0

update  bank set balance=balance-200 where cid='0001'

--立刻验证上面那句代码是否执行成功了。(如果代码执行成功@Error为0,不成功@Error则为错误码)
set @sumErrors=@sumErrors+@@Error

update  bank set balance=balance+200 where cid='0002'

--立刻验证上面那句代码是否执行成功了。(如果代码执行成功@Error为0,不成功@Error则为错误码)
set @sumErrors=@sumErrors+@@Error

if(@sumErrors<>0) --如果上面的两条update语句只要有其中一条执行失败,@sumErrors都将不会等于0
	begin 
		rollback tran --回滚
	end
else
	commit --如果@sumErrors等于0,即两条update语句都执行成功。就提交事务

注意:这里我为什么要独立声明一个@sumErrors, 而不是直接使用@@ERROR全局变量来判断两条语句是否执行成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值