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

事务适用场景

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

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

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

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

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

use YinHangDB
go
create procedure tt10000
	@outZhangHao int,
	@ruZhangHao int,
	@Money int
as
	declare @c1 int = 0--错误的个数
	begin transaction --开启事务
		begin
			--转出
			update Card set CurrentMoney = CurrentMoney - @Money where StudentId = @outZhangHao
			set @c1 = @c1 + @@ERROR

			--转入
			update Card set CurrentMoney = CurrentMoney + @Money where StudentId = @ruZhangHao
			set @c1 = @c1 + @@ERROR
			if(@c1>0)
				rollback transaction
			else 
				commit transaction
		end

go	
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)
        {
            //设置执行的sql
            cmd.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"));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/416387.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统安装使用nginx

1.编译安装Nginx服务 (1)关闭防火墙&#xff0c;将安装nginx所需要软件包传到/opt目录下 systemctl stop firewalld systemctl disable firewalld setenforce 0 将压缩包传入到/opt目录下 cd /opt wget http://nginx.org/download/nginx-1.18.0.tar.gz (2). 安装依赖…

【MATLAB】ICEEMDAN_ MFE_SVM_LSTM 神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 ICEEMDAN是指“改进的完全扩展经验模态分解与自适应噪声”&#xff08;Improved Complete Ensemble Empirical Mode Decomposition with Adaptive Noise&#xff09;&#xff0c;它是CEEM…

Constructor构造方法

在我们创建实例时&#xff0c;我们经常需要同时初始化这个实例&#xff0c;例如&#xff1a; Person ming new Person(); ming.setName("卫什么"); ming.setAge("18"); 这样需要三行代码&#xff0c;实际上&#xff0c;在我们创建实例时&#xff0c;是通过…

MATLAB环境下脑电信号EEG的谱分析

脑电信号一直伴随着人类的生命&#xff0c;脑电波是脑神经细胞发生新陈代谢、离子交换时细胞群兴奋突触电位总和&#xff0c;脑电信号的节律性则和丘脑相关&#xff0c;含有丰富的大脑活动信息。通常我们所接触的脑电图都是头皮脑电图&#xff0c;在有些特殊场合还需要皮下部位…

ad18学习笔记十六:如何放置精准焊盘到特定位置,捕抓功能的讲解

网上倒是一堆相关的指导 AD软件熟练度提升&#xff0c;如何设置板框捕捉&#xff1f;_哔哩哔哩_bilibili 关于Altium Designer 20 的捕抓功能的讲解_ad捕捉设置-CSDN博客 AD软件捕捉进阶实例&#xff0c;如何精确的放置布局元器件&#xff1f;_哔哩哔哩_bilibili AD绘制PCB…

学习阶段单片机买esp32还是stm32?

学习阶段单片机买esp32还是stm32? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「stm32的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xf…

【InternLM 实战营笔记】LMDeploy 的量化和部署

环境配置 vgpu-smi 查看显卡资源使用情况 新开一个终端执行下面的命令实时观察 GPU 资源的使用情况。 watch vgpu-smi复制环境到我们自己的 conda 环境 /root/share/install_conda_env_internlm_base.sh lmdeploy激活环境 conda activate lmdeploy安装依赖库 # 解决 Modu…

深度测试:指定DoC ID对ES写入性能的影响

在[[使用python批量写入ES索引数据]]中已经介绍了如何批量写入ES数据。基于该流程实际测试一下指定文档ID对ES性能的影响有多大。 一句话版 指定ID比不指定ID的性能下降了63%&#xff0c;且加剧趋势。 以下是测评验证的细节。 百万数据量 索引默认使用1分片和1副本。 指定…

JVM(3)

垃圾回收(GC)相关 在C/C中,当我们使用类似于malloc的内存开辟,还需要手动释放内存空间,这样的机制在使用时给我们造成了诸多不便,但在Java中,有垃圾回收这样的机制,这就是指:我们不再需要手动释放,程序会自动判定,某个内存空间是否可以继续使用,如果内存不使用了,就会自动释放…

Hack The Box-Fawn

目录 TASK 1 TASK 2 TASK 3 TASK 4 TASK 5 TASK 6 TASK 7 TASK 8 TASK 9 TASK 10 TASK 11 SUBMIT FLAG TASK 1 What does the 3-letter acronym FTP stand for?File Transfer Protocol (文件传输协议 FTP)TASK 2 Which port does the FTP service listen on usual…

腾讯云优惠券领取入口、云服务器优惠、领取方法及使用教程

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

国产新能源车确立全球领先地位 珠光材料等上游产业链亦乘风而起

农历新年伊始&#xff0c;中国新能源汽车的老大哥比亚迪率先开启了一波降价狂潮&#xff0c;比亚迪秦PLUS荣耀版、驱逐舰05荣耀版正式上市&#xff0c;相较于上一版本冠军版车型&#xff0c;两款新版本车型价格均下降了2万元至7.98 万元起售&#xff0c;堪称王炸出牌。当天&…

Python教程59:海龟画图turtle满屏飘字(飞雪连天射白鹿,笑书神侠倚碧鸳)

---------------turtle源码集合--------------- Python教程91&#xff1a;关于海龟画图&#xff0c;Turtle模块需要学习的知识点 Python教程51&#xff1a;海龟画图turtle画&#xff08;三角形、正方形、五边形、六边形、圆、同心圆、边切圆&#xff0c;五角星&#xff0c;椭…

Java核心API-反射

反射 文章目录 反射前言一、反射概念二、反射与Class类获取Class对象方式 三、反射访问构造方法1、获取包名2、获取类名3、获取父类名称4、获取接口5、获取类中构造方法1&#xff09;获取所有的构造方法2&#xff09;获取public修饰的构造方法3&#xff09;获取private修饰的构…

基于java SSM springboot动物检疫信息管理系统设计和实现

基于java SSM springboot动物检疫信息管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末…

AI:145-智能监控系统下的行人安全预警与法律合规分析

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

milvus upsert流程源码分析

milvus版本:v2.3.2 整体架构: Upsert 的数据流向: 1.客户端sdk发出Upsert API请求。 import numpy as np from pymilvus import (connections,Collection, )num_entities, dim 4, 3print("start connecting to Milvus") connections.connect("default",…

代码随想录刷题训练营day25:LeetCode(216)组合总和III、LeetCode(17)电话号码的字母组合

代码随想录刷题训练营day25&#xff1a;LeetCode(40)组合总和 II、LeetCode(216)组合总和III、LeetCode(17)电话号码的字母组合 LeetCode(40)组合总和 II 题目 代码 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util…

lv19 多态 4

1 虚函数 虚函数&#xff08; 基类指针可指向派生类对象&#xff0c; 动态联编&#xff09; 先看示例&#xff0c;不加virtual&#xff0c;不认对象认指针。 #include <iostream>using namespace std;class A{ public:A(){ }~A(){ }void show(){cout<<"AAA…

火灾安全护航:火灾监测报警摄像机助力建筑安全

火灾是建筑安全中最常见也最具破坏力的灾难之一&#xff0c;为了及时发现火灾、减少火灾造成的损失&#xff0c;火灾监测报警摄像机应运而生&#xff0c;成为建筑防火安全的重要技术装备。 火灾监测报警摄像机采用高清晰度摄像头和智能识别系统&#xff0c;能够全天候监测建筑内…