使用ADO.NET操作SqlServer,开启一个事务
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,开启一个事务的更多相关文章
- 使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。
使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务.
- .NET基础操作回顾_使用ADO.NET操作SqlServer使用的类
有些工具用的久了或者有新工具出现后,就慢慢的遗忘了很多,它们从熟悉的变成陌生,当然,对于我们来说不是好事吧. 今天回顾一下ADO.NET用到的MS的基础类库,先上代码(标准的SqlServer操作) ...
- sql server 开启一个事务
开启事务,回滚 /*============================================================== */ /* Date : 2020年11月18日 11 ...
- C#操作SQLServer的一个简单封装
class DBHandler { //SqlConnection数据库连接对象 private SqlConnection localConnection = null; //构造函数中初始化连接对 ...
- Sql Server 中如果使用TransactionScope开启一个分布式事务,使用该事务两个并发的连接会互相死锁吗
提问: 如果使用TransactionScope开启一个分布式事务,使用该事务两个并发的连接会互相死锁吗? 如果在.Net中用TransactionScope开启一个事务. 然后在该事务范围内启动两个 ...
- mysql一个事务中有DDL语句的binlog情况
在autocommit=1的情况下,开启一个事务,如果里面有DDL语句,那么事务开始到DDL语句之间的DML语句都会被提交.再开启新的事务.可以从binlog中看出 session语句: 09 ...
- REQUIRES_NEW 如果不在一个事务那么自己创建一个事务 如果在一个事务中 自己在这个大事务里面在创建一个子事务 相当于嵌套事务 双层循环那种
REQUIRES_NEW 如果不在一个事务那么自己创建一个事务 如果在一个事务中 自己在这个大事务里面在创建一个子事务 相当于嵌套事务 双层循环那种 不管是否存在事务,业务方法总会自己开启一个事 ...
- 关于分布式事务的一个误解:使用了TransactionScope就一定会开启分布式事务吗?
背景: 事务是数据库管理系统的一个基本概念,事务具有四个基本特点,即ACID:原子性(Atomicity).一致性(Consistency).隔离性(Isolation)和持久性(Durability ...
- django之查询操作及开启事务
目录 聚合查询 aggregate 聚合函数 分组查询 annotate F与Q查询 F查询 Q查询 ORM操作事务 django中开启事务 聚合查询 aggregate 操作外键字段管理数据的时候, ...
随机推荐
- 关于ffmpeg /iis 8.5 服务器下,视频截取第一帧参数配置
ffmpeg 视频截取第一帧参数配置: 网站找了很多资料,但是都不能满足要求,然后自己写下解决过程. 首先看自己PHP 版本,安全选项里面 php5.4 跟php5.6 是不一样的.去除里面的sys ...
- Spring 注解编程之注解属性别名与覆盖
前两篇文章咱聊了深入了解了 Spring 注解编程一些原理,这篇文章我们关注注解属性方法,聊聊 Spring 为注解的带来的功能,属性别名与覆盖. 注解属性方法 在进入了解 Spring 注解属性功能 ...
- 2017普及组D1T3 洛谷P3956 棋盘
2017普及组D1T3 洛谷P3956 棋盘 原题 题目描述 有一个m×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在 ...
- 9.秋招复习简单整理之Spring面试AOP和IOC的理解
1.Spring的AOP理解: OOP面向对象,允许开发者定义纵向的关系,但不适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用. AOP,一般称为面向切面,作为面向对象的一种补充,用 ...
- ElementUI 简要源码解析——Basic篇
Layout 布局 row 布局组件中的父组件,用于控制子组件.很简单的一个布局标签,主要通过 justify 和 align 控制子元素的对齐方式,使用 render 函数通过传入的 tag 属性控 ...
- Eclipse安装STS插件
由于Spring的配置文件较多,基于Eclipse配置也比较复杂.为了提高开发的效率,建议使用STS开发工具开发,或者在Eclipse安装一个STS插件. 在开发者配置bean的class时候能够根据 ...
- .NET CORE 微信小程序消息验证的坑
进入微信小程序,点击开发->选择消息推送->扫码授权,填写必要参数 进入接口开发: /// <summary> /// 验证小程序 /// </summary> / ...
- openstack实验环境搭建
Openstack实验文档 一.base节点 1.1配置网络 vim /etc/sysconfig/network-scripts/ifcfg-eth0 1.2关闭防火墙和selinux system ...
- 学习笔记-jvm运行时数据区
按照线程私有和共享区域来划分 线程私有 程序计数器 指向当前线程正在执行的字节码行号地址,如果是本地方法,值为undefined 虚拟机中唯一不会oom的区域 为什么会有程序计数器 - java天生多 ...
- 个人永久性免费-Excel催化剂功能第104波-批量选择多种类型的图形对象
在Excel的日常操作过程中,选择绝对是一个高频的操作,之前开发过一些快速选择单元格区域的辅助功能,除了单元格区域,Excel强大之处在于,类似PhotoShop那般可以存放多种图形,并且有图层先后顺 ...