2023年6月21日发(作者:)
C#中SqlTransaction--启动事务先删除从表,再删除主表事务的基本原理介绍using (SqlConnection conn =new SqlConnection(ring)){ //事务启动是通过conn来开启 (); SqlTransaction trans = ransaction();//开启⼀个事务 SqlCommand cmd = new SqlCommand(); //利⽤SqlCommand执⾏事务 //为挂起的本地事务将事务对象和连接都分配给命令对象 tion = conn; ction = trans; try {
foreach (int id in listIds) { //执⾏过程
dText = "update StudentInfo set IsDeleted=1 where StuId=@stuId"; SqlParameter para = new SqlParameter("@StuId",id); (); (para); eNonQuery() } ();//提交事务,代表所有的事务已经提交到数据库 ine("Both records are written to database."); } catch (SqlException ex) { ck();//catch特定⽤法,从挂起状态滚回事务 (e, "异常信息捕捉", , ); return; }}项⽬实例:拿⼀个项⽬中 的例⼦来说,数据库中有两个表,学⽣表和班级表,两个表是通过班级号ClassId联系起来的,那么在录⼊信息的时候,应该先录⼊班级表中的ClassId再录⼊学⽣表的信息;同理,在删除班级信息的时候,先删除从表(和班级有关的学⽣信息),再删除主表(班级表中的班级信息)先删除从表(学⽣表中的班级),再删主表(班级表)实现过程:把执⾏事务封装成了⼀个⽅法,因为,⼀条语句,只能执⾏⼀次,⽐如现在想先删除学⽣表中和班级相关学⽣信息,再删除班级表中的班级信息。⼀般是⽤两条语句,但是这⾥我们封装成⼀个⽅法,执⾏多条sql语句的时候,只需要传参数进去,调⽤⼀次⽅法:1.⾸先,获取datagridview中的classId,写sql语句并添加参数int ClassId = (dr["classId"].ToString());//删除该班级对应的学⽣信息string sqlDelStudent = "update StudentInfo set IsDeleted=1 where ClassId=@classId";//删除班级信息string sqlDelClass = "update ClassInfo set IsDeleted=1 where ClassId=@classId";SqlParameter[] para = {new SqlParameter ("@ClassId", ClassId) };2.然后我们定义⼀个类,负责参数传递public class CommandInfo{ public string CommandText;//sql
或者存储过程名 public DbParameter[] parameters;//参数列表 public bool IsProc;//是否存储过程 public CommandInfo(string comText, bool isProc, DbParameter[] para) { dText = comText;//sql语句 = isProc;//是否存储过程 ters = para;//参数列表 }}3.然后分别把学⽣表和班级表中的信息存储在⼀个泛型List中List
parameters = para};(comStudent);//添加学⽣表的sql语句和参数CommandInfo comClass = new CommandInfo(){ CommandText = sqlDelClass,
parameters = para};(comClass);//添加班级表的sql语句和参数4.都添加成功之后只需要调⽤⼀次执⾏事务,⽅法返回⼀个bool值,成功则为true否则提⽰异常bool bl = Trans(listComs);5.封装的⽅法如下,只是把图中执⾏过程替换6.替换为以下: int count = 0; for (int i = 0; i < ;i++)//遍历list中所有的变量 { dText = comList[i].CommandText;//获取sql语句
或者存储过程 if(comList[i].IsProc)//若是存储过程 { dType = Procedure;//获取存储过程的名称 } else { dType = ;//获取sql语句⽂本 } if(comList[i].>0)//若泛型中的参数列表长度不为0 { ();//每次循环都先清空 ge(comList[i].parameters);//再添加 } count += eNonQuery();//执⾏事务过程,并返回受影响
的⾏数 (); }⾄此,完成了所需功能,演⽰如下:
2023年6月21日发(作者:)
C#中SqlTransaction--启动事务先删除从表,再删除主表事务的基本原理介绍using (SqlConnection conn =new SqlConnection(ring)){ //事务启动是通过conn来开启 (); SqlTransaction trans = ransaction();//开启⼀个事务 SqlCommand cmd = new SqlCommand(); //利⽤SqlCommand执⾏事务 //为挂起的本地事务将事务对象和连接都分配给命令对象 tion = conn; ction = trans; try {
foreach (int id in listIds) { //执⾏过程
dText = "update StudentInfo set IsDeleted=1 where StuId=@stuId"; SqlParameter para = new SqlParameter("@StuId",id); (); (para); eNonQuery() } ();//提交事务,代表所有的事务已经提交到数据库 ine("Both records are written to database."); } catch (SqlException ex) { ck();//catch特定⽤法,从挂起状态滚回事务 (e, "异常信息捕捉", , ); return; }}项⽬实例:拿⼀个项⽬中 的例⼦来说,数据库中有两个表,学⽣表和班级表,两个表是通过班级号ClassId联系起来的,那么在录⼊信息的时候,应该先录⼊班级表中的ClassId再录⼊学⽣表的信息;同理,在删除班级信息的时候,先删除从表(和班级有关的学⽣信息),再删除主表(班级表中的班级信息)先删除从表(学⽣表中的班级),再删主表(班级表)实现过程:把执⾏事务封装成了⼀个⽅法,因为,⼀条语句,只能执⾏⼀次,⽐如现在想先删除学⽣表中和班级相关学⽣信息,再删除班级表中的班级信息。⼀般是⽤两条语句,但是这⾥我们封装成⼀个⽅法,执⾏多条sql语句的时候,只需要传参数进去,调⽤⼀次⽅法:1.⾸先,获取datagridview中的classId,写sql语句并添加参数int ClassId = (dr["classId"].ToString());//删除该班级对应的学⽣信息string sqlDelStudent = "update StudentInfo set IsDeleted=1 where ClassId=@classId";//删除班级信息string sqlDelClass = "update ClassInfo set IsDeleted=1 where ClassId=@classId";SqlParameter[] para = {new SqlParameter ("@ClassId", ClassId) };2.然后我们定义⼀个类,负责参数传递public class CommandInfo{ public string CommandText;//sql
或者存储过程名 public DbParameter[] parameters;//参数列表 public bool IsProc;//是否存储过程 public CommandInfo(string comText, bool isProc, DbParameter[] para) { dText = comText;//sql语句 = isProc;//是否存储过程 ters = para;//参数列表 }}3.然后分别把学⽣表和班级表中的信息存储在⼀个泛型List中List
parameters = para};(comStudent);//添加学⽣表的sql语句和参数CommandInfo comClass = new CommandInfo(){ CommandText = sqlDelClass,
parameters = para};(comClass);//添加班级表的sql语句和参数4.都添加成功之后只需要调⽤⼀次执⾏事务,⽅法返回⼀个bool值,成功则为true否则提⽰异常bool bl = Trans(listComs);5.封装的⽅法如下,只是把图中执⾏过程替换6.替换为以下: int count = 0; for (int i = 0; i < ;i++)//遍历list中所有的变量 { dText = comList[i].CommandText;//获取sql语句
或者存储过程 if(comList[i].IsProc)//若是存储过程 { dType = Procedure;//获取存储过程的名称 } else { dType = ;//获取sql语句⽂本 } if(comList[i].>0)//若泛型中的参数列表长度不为0 { ();//每次循环都先清空 ge(comList[i].parameters);//再添加 } count += eNonQuery();//执⾏事务过程,并返回受影响
的⾏数 (); }⾄此,完成了所需功能,演⽰如下:
发布评论