1、创建SqlConnection对象(connStr是链接字符串)

SqlConnection conn = new SqlConnection(connStr);

2、创建SqlTransaction对象(执行事务)

因为SqlTransaction对象继承了DbTransaction对象

而DbTransaction的构造函数使用了Protected关键字保护,只能被基类和子类实例化

所以,如果我们要想创建一个SqlTransaction对象,就要从其他方面入手,比如SqlConnection对象

使用SqlConnection对象的BeginTransaction()函数创建一个SqlTransaction对象

SqlTransaction tran = conn.BeginTransaction();

3、创建SqlCommand对象,不过创建之前我们可以先看一下SqlCommand的构造函数

3.1

可以发现,后两个构造函数都可以传入SqlTransaction对象,我们只需要用第三个构造函数来创建SqlConmmand就行

SqlCommand cmd = new SqlCommand(sql,conn,tran);

3.2

如果有很多sql语句要执行,比如一个sql语句数组,则创建一个空的SqlCommand对象(不推荐,因为需要和数据库进行很多次交互,浪费性能)

SqlCommand cmd = new SqlCommand();

手动绑定SqlTransaction对象和SqlConnection对象

//绑定Command对象的Connection对象
cmd.Connection = conn;
//绑定Command对象的Transaction对象
cmd.Transaction = tran; 

通过循环来绑定和执行Sql语句(设置SqlCommand的CommandText属性)

//通过循环执行事务
int i;
for (i = 0; i < sqls.Length; i++)
{
//设置要执行的语句
cmd.CommandText = sqls[i];
//添加参数
if (parm != null && parm[i] != null && parm[i].Length > 0) cmd.Parameters.AddRange(parm[i]);
//执行
if (cmd.ExecuteNonQuery()<=0) {
//回滚
tran.Rollback();
//结束
break;
};
}

全部正确的话则提交事务

if(i==sqls.Length) tran.Commit();

4、完整代码

/// <summary>
/// 执行一个事务
/// </summary>
/// <param name="sqls">Sql语句数组</param>
/// <param name="parm">参数数组(必须和sqls数组长度一致、如果为空也要传递过来)</param>
/// <returns>返回成功或失败</returns>
public static Boolean ExecuteTransaction(String[] sqls,params SqlParameter[][] parm) {
//创建链接对象
using (SqlConnection conn = new SqlConnection(connStr)) {
//打开链接
conn.Open();
//创建执行命令对象
SqlCommand cmd = new SqlCommand();
//创建一个事务
//通过conn对象获取一个事务对象
SqlTransaction tran = conn.BeginTransaction(); SqlCommand cmd1 = new SqlCommand(sqls[0],conn,tran); try
{
//绑定Command对象的Connection对象
cmd.Connection = conn;
//绑定Command对象的Transaction对象
cmd.Transaction = tran; //通过循环执行事务
for (int i = 0; i < sqls.Length; i++)
{
//设置要执行的语句
cmd.CommandText = sqls[i];
//添加参数
if (parm != null && parm[i] != null && parm[i].Length > 0) cmd.Parameters.AddRange(parm[i]);
//执行
if (cmd.ExecuteNonQuery()<=0) {
//回滚
tran.Rollback();
//结束
return false;
};
}
//提交事务
tran.Commit();
return true;
}
catch (Exception e)
{
tran.Rollback();
return false;
} }
}

  

使用ADO.NET操作SqlServer,开启一个事务的更多相关文章

  1. 使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。

    使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务.

  2. .NET基础操作回顾_使用ADO.NET操作SqlServer使用的类

    有些工具用的久了或者有新工具出现后,就慢慢的遗忘了很多,它们从熟悉的变成陌生,当然,对于我们来说不是好事吧. 今天回顾一下ADO.NET用到的MS的基础类库,先上代码(标准的SqlServer操作) ...

  3. sql server 开启一个事务

    开启事务,回滚 /*============================================================== */ /* Date : 2020年11月18日 11 ...

  4. C#操作SQLServer的一个简单封装

    class DBHandler { //SqlConnection数据库连接对象 private SqlConnection localConnection = null; //构造函数中初始化连接对 ...

  5. Sql Server 中如果使用TransactionScope开启一个分布式事务,使用该事务两个并发的连接会互相死锁吗

    提问: 如果使用TransactionScope开启一个分布式事务,使用该事务两个并发的连接会互相死锁吗? 如果在.Net中用TransactionScope开启一个事务. 然后在该事务范围内启动两个 ...

  6. mysql一个事务中有DDL语句的binlog情况

      在autocommit=1的情况下,开启一个事务,如果里面有DDL语句,那么事务开始到DDL语句之间的DML语句都会被提交.再开启新的事务.可以从binlog中看出   session语句: 09 ...

  7. REQUIRES_NEW 如果不在一个事务那么自己创建一个事务 如果在一个事务中 自己在这个大事务里面在创建一个子事务 相当于嵌套事务 双层循环那种

    REQUIRES_NEW   如果不在一个事务那么自己创建一个事务 如果在一个事务中 自己在这个大事务里面在创建一个子事务  相当于嵌套事务 双层循环那种 不管是否存在事务,业务方法总会自己开启一个事 ...

  8. 关于分布式事务的一个误解:使用了TransactionScope就一定会开启分布式事务吗?

    背景: 事务是数据库管理系统的一个基本概念,事务具有四个基本特点,即ACID:原子性(Atomicity).一致性(Consistency).隔离性(Isolation)和持久性(Durability ...

  9. django之查询操作及开启事务

    目录 聚合查询 aggregate 聚合函数 分组查询 annotate F与Q查询 F查询 Q查询 ORM操作事务 django中开启事务 聚合查询 aggregate 操作外键字段管理数据的时候, ...

随机推荐

  1. java-NIO-DatagramChannel(UDP)

    Java NIO中的DatagramChannel是一个能收发UDP包的通道.因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入.它发送和接收的是数据包. 打开 DatagramChann ...

  2. POJ 3183:Stump Removal(模拟)

    http://poj.org/problem?id=3183 题意:有n个树桩,分别有一个高度h[i],要用Bomb把树桩都炸掉,如果炸的位置的两边树桩高度小于Bomb炸的树桩高度,那么小于树桩高度的 ...

  3. HDU 1398:Just a Hook(线段树区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 Just a Hook Problem Description   In the game of DotA ...

  4. Mybatis 一对多分页踩坑 对collection的分析

    背景描述: 产品和结算对象(结算名和结算金额)是一对多的关系,使用 collection 做一对多配置.但是出现一对多时,数据没有整合至一起,导致一个产品重复出现. class ResponseVo{ ...

  5. django基础知识之状态保持session:

    状态保持 http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态 客户端与服务器端的一次通信,就是一次会话 实现状态保持的方式:在客户端或服务器端存储与会话有关的数据 存储方式包括c ...

  6. python3 连接数据库注意点

    类库:pymysql ''' Created on 2019年 @author: Root ''' import pymysql from name import getName # 数据库连接信息 ...

  7. 业以太网:西门子PROFINET诊断功能SFC12-OB86-SFB20概览

    [OB86配合SFC12在PROFINET诊断中的应用] OB86是机架故障组织块,操作系统在检测到下列PN系统故障时将调用OB86: 1.检测到PROFINET IO设备故障,故障产生和消失时分别调 ...

  8. 异常——cmd下javac错误:编码GBK不可映射字符

    在看菜鸟教程时候用记事本创建文件,之后用notepad++编辑后,运行出现错误. 首先从信息上知道这是编码的问题了.开始试了下再notepad++上打开文件选择标签栏的“Encoding”中的“enc ...

  9. Communicating with the UI Thread_翻译

    In the previous lesson you learned how to start a task on a thread managed by ThreadPoolExecutor. Th ...

  10. 后端开发工具:反编译工具、VS插件、.NET Framework源码地址

    再学习.工作中,开发免不了要使用第三方工具.今天介绍2款反编译工具 一.dnspy 免安装.免费.可调试.可修改重新编译dll 开源项目地址:https://github.com/0xd4d/dnSp ...