使用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 操作外键字段管理数据的时候, ...
随机推荐
- spark 源码分析之十二 -- Spark内置RPC机制剖析之八Spark RPC总结
在spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRpcEnv中,剖析了NettyRpcEnv的创建过程. Dispatcher.NettyStreamManager.T ...
- kafka源码分析(一)server启动分析
1 启动入口Kafka.scala Kafka的启动入口是Kafka.scala的main()函数: def main(args: Array[String]): Unit = { try { //通 ...
- POJ 2887:Big String(分块)
http://poj.org/problem?id=2887 题意:给出一个字符串,还有n个询问,第一种询问是给出一个位置p和字符c,要在位置p的前面插入c(如果p超过字符串长度,自动插在最后),第二 ...
- 个人亲测,在win10系统下安装多实例mysql8.0详细教程
由于公司的新项目需要导入sql脚本,需要更高版本的mysql数据库,原来的数据库我也不想删除和升级,因此安装了第二个mysql8的实例,废话不多说,步骤如下: 1.下载mysqlGPL版本,我下载的版 ...
- Jpa 笔记
ORM 思想 对象关系映射, 建立实体类和表的关系映射关系, 实体类和表中字段的映射关系,我们操作实体类底层是操作数据表, 进而自动的拼接出SQL语句 Jpa规范 Jpa(Java Persisten ...
- 基于go语言结合微信小程序开发的微商城系统
最近在慕课网上录制了一门<Golang微信小程序微商城系统原型>,这门免费课程特别适合在校大学生或者刚毕业的大学生,go语言初学者以及想要从事微商城开发项目入门的小伙伴们来学习.在课程当中 ...
- Bzoj 3654 图样图森波 题解
3654: 图样图森破 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 123 Solved: 66[Submit][Status][Discuss] ...
- ThreadGroup详细讲解
import java.util.concurrent.TimeUnit; public class Test { public static void main(String[] args){ // ...
- 最好的导航分割栏,分割线,实现底部透明,纯css
<div class="Ui_Ct_Line padding_5"> <div>为您推荐</div> </div> .Ui_Ct_L ...
- 第一届合天杯河北科技大学网络安全技术大赛 web6 writeup