当前位置: 首页 > news >正文

T - SQL使用事务 及 在Winform使用事务

事务适用场景

        1 事务使用在存储过程中,直接在数据库中进行编写
        2 事务使用在Winfrom项目中

SQl:使用事务转账操作的实例

一般都会找一个变量记录错误的个数,@error记录上一句sql的错误和错误编号

declare @errornum int  = 0 -- 定义一个记录错误个数的变量
begin transaction -- 开启事务begin-- 转出操作update Card set CurrentMoney = CurrentMoney - 100000 where StudentId = 1002set @errornum = @errornum + @@error -- 把@@error加到总的记录上-- 转入操作update Card set CurrentMoney = CurrentMoney + 100000 where StudentId = 1004set @errornum = @errornum + @@ERRORif(@errornum > 0) -- 证明有错误,把之前已经执行的操作回滚到原先的数据上rollback transaction -- 回滚事务else -- 没有错误,提交事务commit transactionend
go
select * from Card

声明一个过程 包含三个输入参数 分别是两个转账的卡号 和转账的金额

use YinHangDB
go
create procedure tt10000@outZhangHao int,@ruZhangHao int,@Money int
asdeclare @c1 int = 0--错误的个数begin transaction --开启事务begin--转出update Card set CurrentMoney = CurrentMoney - @Money where StudentId = @outZhangHaoset @c1 = @c1 + @@ERROR--转入update Card set CurrentMoney = CurrentMoney + @Money where StudentId = @ruZhangHaoset @c1 = @c1 + @@ERRORif(@c1>0)rollback transactionelse commit transactionendgo	
select * from Card
--测试转账失败的操作
exec tt10000 1000,1001,100000--测试转账成功
exec tt10000 1000,1001,50000

Winfrom 使用事故实例

链接SQl 数据库

public string connString = @"Server=.;Database=SMDB;Uid=sa;Pwd=123456";

搭建Winfrom界面

 测试事务回滚的方法

 private void button1_Click(object sender, EventArgs e){//删除前学生总个数int num1 = (int)GetSingleCount("select count(*) from Students");this.listBox1.Items.Add("删除前学生总个数:"+ num1);  // 展示在listbox下// 测试删除学生失败进行事务回滚操作//定义一个列表字符串 List<string> list = new List<string>(){"delete from Students where StudentId = 1000005","delete from Students where StudentId = 1000024","delete from Students where StudentId = 1000006"};//执行删除操作 把list里面每一句sql都去执行一下int result = 0;try{result = UpdateDataBase(list);}catch (Exception ex){this.listBox1.Items.Add(ex.Message);}if (result > 0){this.listBox1.Items.Add("删除成功");}else{this.listBox1.Items.Add("删除失败");}this.listBox1.Items.Add("删除之后剩余人数为:" + (int)GetSingleCount("select count(*) from Students"));}

封装多个删除语句执行操作
参数是多个sql的集合
返回值 int是否执行成功

public int UpdateDataBase(List<string> list)
{SqlConnection conn = new SqlConnection(connString);//  new SqlCommand(sql, conn)//  没有指定执行sql 没有指定连接,下面必须在写代码把连接对象添加上SqlCommand cmd = new SqlCommand(); cmd.Connection = conn;try{conn.Open();//开启事务cmd.Transaction = conn.BeginTransaction();int result = 0;//记录删除时候受影响的行数//取出每一个sql语句 分别执行foreach (string sql in list){//设置执行的sqlcmd.CommandText = sql; result += cmd.ExecuteNonQuery();// cmd.ExecuteNonQuery() 返回受影响行数如果删除成功了,受影响行数不为0}//如果执行错误了 跳转到catch里面 在catch执行回滚// 没有出错 提交事务cmd.Transaction.Commit();return result;}catch(Exception ex){if (cmd.Transaction != null){cmd.Transaction.Rollback(); // 执行sql语句有错误的情况 执行回滚操作}throw new Exception("执行删除sql事务出错:" + ex.Message);}finally{// 不管是否执行有误 把事务置为null 清除事务if(cmd.Transaction!=null){cmd.Transaction = null;}conn.Close();}
}

获取数据库个数的方法

 public object GetSingleCount(string sql)
 {
     SqlConnection conn = new SqlConnection(connString);
     SqlCommand cmd = new SqlCommand(sql, conn);
     conn.Open();
     return cmd.ExecuteScalar();

 }

测试事务提交的方法 

private void button2_Click(object sender, EventArgs e)
{//删除前学生总个数int num1 = (int)GetSingleCount("select count(*) from Students");this.listBox1.Items.Add("删除前学生总个数:" + num1);  // 展示在listbox下// 测试删除学生失败进行事务回滚操作//定义一个列表字符串 List<string> list = new List<string>(){"delete from Students where StudentId = 1000033","delete from Students where StudentId = 1000031","delete from Students where StudentId = 1000032"};//执行删除操作 把list里面每一句sql都去执行一下int result = 0;try{result = UpdateDataBase(list);}catch (Exception ex){this.listBox1.Items.Add(ex.Message);}if (result > 0){this.listBox1.Items.Add("删除成功");}else{this.listBox1.Items.Add("删除失败");}this.listBox1.Items.Add("删除之后剩余人数为:" + (int)GetSingleCount("select count(*) from Students"));
}

http://www.lryc.cn/news/310009.html

相关文章:

  • string(三)--实现
  • textbox跨线程写入
  • 幻兽帕鲁专用服务器搭建之Linux部署配置教程
  • Kubernetes: 本地部署dashboard
  • Outlook邮箱IMAP密码怎么填写?账户设置?
  • [计算机网络]--I/O多路转接之poll和epoll
  • 【NTN 卫星通信】卫星和无人机配合的应用场景
  • Git 分布式版本控制系统
  • ng : 无法将ng项识别为 cmdlet、函数、脚本文件或可运行程序的名称
  • iOS小技能:苹果书签打包教程【WebClip描述文件(WebClip Configuration Profile)】
  • Spring Cloud项目合规性注册之-(单元集成测试报告)
  • IntelliJ IDEA 常用的插件
  • 超详细红黑树的模拟实现
  • 【亚马逊云科技】通过Amazon CloudFront(CDN)快速访问资源
  • ES-ES的基本概念
  • 排序算法——快速排序的非递归写法
  • 【论文阅读】基于人工智能目标检测与跟踪技术的过冷流沸腾气泡特征提取
  • RabbitMQ讲解与整合
  • python 基础知识点(蓝桥杯python科目个人复习计划56)
  • 【vue】vue中数据双向绑定原理/响应式原理,mvvm,mvc、mvp分别是什么
  • 基于反光柱特征的激光定位算法思路
  • CSM是什么意思?
  • ES6 面试题
  • 智能指针(C++)
  • 社区店商业模式探讨:如何创新并持续盈利?
  • 一些可以访问gpt的方式
  • springer模板参考文献不显示
  • 【【C语言简单小题学习-1】】
  • mongoDB 优化(1)索引
  • stable diffusion webUI之赛博菩萨【秋葉】——工具包新手安裝与使用教程