实现目的:点击按钮,原子性执行两条sql语句,同时成功或同时失败
数据库有这三个字段(忽略已有的一条记录):
一、用事务的sql语句
按钮事件完整代码:
//事务处理插入sql语句 using (SQLiteConnection con = new SQLiteConnection("Data Source=xxx.db3;Pooling=true;FailIfMissing=false;Password=123456")) { using (SQLiteCommand cmd = new SQLiteCommand()) { con.Open(); SQLiteTransaction sqltran = con.BeginTransaction();//用的SQLite数据库,其他数据库相应变化 cmd.Connection = con; cmd.Transaction = sqltran; try { cmd.CommandText = string.Format("insert into jy_cdjy_workflow(id,cjsbh,status) values (1,2,3)"); cmd.ExecuteNonQuery(); cmd.CommandText = string.Format("insert into jy_cdjy_workflow(id,cjsbh,status) values (4,5,6,6)");//故意多添加一个值,看看错误 cmd.ExecuteNonQuery(); sqltran.Commit();//执行完要提交 } catch(Exception ex) { MessageBox.Show(ex.Message);//抛出的异常消息 sqltran.Rollback();//如果某条sql语句执行不成功,回滚 } } }
故意将第二条sql语句写错
点击按钮:
弹出错误,而且也把第一条执行的sql语句回滚了,数据库中没有添加数据
二、没有用事务处理插入sql语句
//没有事务处理插入sql语句 using (SQLiteConnection con = new SQLiteConnection("Data Source=C:/Users/Administrator/Documents/Visual Studio 2010/Projects/gjjy/gjjy/db/gjjy.db3;Pooling=true;FailIfMissing=false;Password=gjjy_jinhetech123")) { using (SQLiteCommand cmd = new SQLiteCommand()) { con.Open(); //SQLiteTransaction sqltran = con.BeginTransaction(); cmd.Connection = con; //cmd.Transaction = sqltran; try { cmd.CommandText = string.Format("insert into jy_cdjy_workflow(id,cjsbh,status) values (1,2,3)"); cmd.ExecuteNonQuery(); cmd.CommandText = string.Format("insert into jy_cdjy_workflow(id,cjsbh,status) values (4,5,6,6)"); cmd.ExecuteNonQuery();//sqltran.Commit(); } catch(Exception ex) { MessageBox.Show(ex.Message); //sqltran.Rollback(); } } }
点击按钮:
虽然第二条抛出错误,但是第一条sql语句还是成功执行并插入数据库了
时间: 2024-11-07 00:44:15