使用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 操作外键字段管理数据的时候, ...
随机推荐
- 关于elasticsearch安装及搭建集群时候的错误
1,在Windows上解压后启动elasticsearch后可能cmd中会抛出java 无法初始话异常,网上查询必须用的是jdk1.8以上,可是本人用的 就是jdk1.8啊,半天解决无果,最后重新安装 ...
- Hash碰撞概率
计算Hash冲突的概率 虽然已经很多可以选择的Hash函数,但创建一个好的Hash函数仍然是一个活跃的研究领域.一些Hash函数是快的,一些是慢的,一些Hash值均匀地分布在值域上,一些不是.对于我们 ...
- S7 300数据块中的变量指定断电保持特性
利用DB块内变量属性的保持性,勾选上就可以保持了.300PLC数据块默认断电保持.
- XAML与C#与WPF三者到底有什么关系?
XAML是.NET体系开发程序或者网页时前台编程的一种布局方式或者说开发语言,可以比较自由的用标签的方式进行布局,借鉴了HTML和XML等语言的风格,并且加入了一些动画等的实现.C#则是后台逻辑开发用 ...
- MySQL主从、主主、半同步节点架构的的原理及实验总结
一.原理及概念: MySQL 主从复制概念 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来 ...
- 【学习笔记】动态规划—斜率优化DP(超详细)
[学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...
- MyBatis foreach标签的用法
From<MyBatis从入门到精通> 一.foreach实现in集合 1.映射文件中添加的代码: <!-- 4.4 foreach用法 SQL语句有时会使用IN关键字,例如id i ...
- Netty-新连接接入源码解读
本片博文来看Netty的服务端是如何处理新连接接入问题的 什么是新连接接入?以及新连接接入前,Netty处于什么状态 netty的服务端NioServerSocketChannel初始化,注册在Bos ...
- 用了三星Dex,我已经快一个月回家没开过电脑了
其实比较早就知道手机使用显示屏扩展的功能,但是以前的技术可能受性能影响体验还不太好.后来让我期待的是Linux On Dex这个项目知道了手机已经如此强大了,可惜只能是是特定机器,因此在618之际乘着 ...
- python 3.5学习笔记(第四章)
本章内容: 一..装饰器 二.生成器 三.迭代器 四.python中的内置方法 五.json & pickle 的数据序列化及反序列化 六.程序目录结构规范 七.补充内容 一.装饰器: 1.概 ...