问题描述
问题如下:现在sql数据库中有两张表table1,table2,。我要同时向这两张表更新数据。要两张表都更新成功了则算成功。比如:table1更新成功了。而table2更新数据失败。则算失败。要将table1的数据返回到更新前如果用SqlTransaction事物控制,则能达到效果。但是假如我现在有一张表table3,要对table3和table2进行同样的操作。不是又要建一个SqlTransaction事物吗???还有是能不能有其他的方法实现。。。求各位大神们释疑啊。。。
解决方案
解决方案二:
是啊,当然你可以写一个公共的入口,里面提供事务的开始和结束功能,你只需要把你的操作动态的传入即可
解决方案三:
你搜索下TransactionScope
解决方案四:
事务控制回滚是最简单直接的方式
解决方案五:
引用2楼starfd的回复:
你搜索下TransactionScope
这个我用过。。事物代码块。每次有这种操作都要再写一次。。。感觉不是很科学啊
解决方案六:
谁说需要再写一次的using(TransactionScopescope=newTransactionScope()){if(UpdateTable1()&&UpdateTable2()&&UpdateTable3()){//上面上个方法分别为单独更新某表的方法scope.Commit();}}
解决方案七:
解决方案八:
我怎么看不懂你说的是什么把3个操作放在一个事物里不就解决了?一个事物里可以支持多个sql的更新和回滚。
解决方案九:
看情况,TABLE1、TABLE2、TABLE3如果是三者都需要更新成功才可以,就写在一起如果TABLE1、TABLE2更新与TABLE2、TABLE3更新没必然联系,可以分开写
解决方案十:
使用事务同时提交多个数据表更新数据privatevoidFrm_Main_Load(objectsender,EventArgse){//创建数据库连接对象SqlConnectionsqlConn=newSqlConnection("DataSource=WIN-GI7E47AND9R\LS;Database=db_TomeTwo;uid=sa;pwd=;");List<String>strSqls=newList<string>();//创建集合对象StringstrDelete1="deleteFromtb_AuthorWhereAuthorId='99'";//定义删除第一个表的SQL语句strSqls.Add(strDelete1);//将SQL语句添加到集合中StringstrDelete2="deleteFromtb_AuthorsBookWhereAuthorId='99'";//定义删除第二个表的SQL语句strSqls.Add(strDelete2);//将SQL语句添加到集合中stringstrInsert1="insertintotb_Authorvalues('99','zhd')";//定义添加第一个表的SQL语句strSqls.Add(strInsert1);//将SQL语句添加到集合中stringstrInsert2="insertintotb_AuthorsBookvalues('66','C#范例大全','99')";//定义添加第二个表的SQL语句strSqls.Add(strInsert2);//将SQL语句添加到集合中if(ExecDataBySqls(strSqls,sqlConn))//如果执行成功{MessageBox.Show("提交tb_Author数据表成功!","信息提示");MessageBox.Show("提交tb_AuthorsBook数据表成功!","信息提示");}else{MessageBox.Show("提交tb_Author数据表失败!","信息提示");MessageBox.Show("提交tb_AuthorsBook数据表失败!","信息提示");}//codego.net/15/4/37/SqlDataAdaptersqlda1=newSqlDataAdapter("select*fromtb_Author",sqlConn);//创建数据桥接器对象SqlDataAdaptersqlda2=newSqlDataAdapter("select*fromtb_AuthorsBook",sqlConn);//创建数据桥接器对象DataSetmyds=newDataSet();//创建数据集对象sqlda1.Fill(myds,"tb_Author");//填充数据集sqlda2.Fill(myds,"tb_AuthorsBook");//填充数据集dataGridView1.DataSource=myds.Tables["tb_Author"];//对第一个DataGridView进行数据绑定dataGridView2.DataSource=myds.Tables["tb_AuthorsBook"];//对第二个DataGridView进行数据绑定}//<paramname="strSqls">使用List泛型封装多条SQL语句</param>//<paramname="sqlConn">数据库连接</param>publicboolExecDataBySqls(List<string>strSqls,SqlConnectionsqlConn){boolbooIsSucceed=false;//声明提交数据是否成功的标记SqlCommandsqlCmd=newSqlCommand();//创建SqlCommand对象sqlCmd.Connection=sqlConn;//设置SqlCommand对象的Connection属性if(sqlConn.State==ConnectionState.Closed){sqlConn.Open();//打开数据库连接}SqlTransactionsqlTran=sqlConn.BeginTransaction();//开始一个事务try{sqlCmd.Transaction=sqlTran;//设置SqlCommand对象的Transaction属性foreach(stringiteminstrSqls){sqlCmd.CommandType=CommandType.Text;//设置命令类型为SQL文本命令sqlCmd.CommandText=item;//设置要对数据源执行的SQL语句sqlCmd.ExecuteNonQuery();//执行SQL语句并返回受影响的行数}sqlTran.Commit();//提交事务,持久化数据booIsSucceed=true;//表示提交数据库成功}catch{sqlTran.Rollback();//回滚事务,恢复数据booIsSucceed=false;//表示提交数据库失败!}finally{sqlConn.Close();//关闭连接strSqls.Clear();//清除列表strSqls中的元素}returnbooIsSucceed;//方法返回值}