怎样让SqlDataAdapter.Update 支持事务
利用SqlDataAdapter.Update方法将DATASET中的数据更新到数据库,功能已经实现了。但是缺少事务,不能保证数据的完整性。以下是源代码,请问怎么添加事务功能。
DataTable t = (DataTable)Session["product"]; using (SqlConnection con = Ares.WebSite.App_Code.DB.CreateConn()) { con.Open(); SqlDataAdapter sda = new SqlDataAdapter("select top 1 * from ProductTab", con); DataSet ds = new DataSet(); sda.Fill(ds, "prouct"); SqlCommandBuilder builder = new SqlCommandBuilder(sda); for (int i = 0; i < t.Rows.Count; i++) { DataRow r = t.NewRow(); ds.Tables["car"].Rows.Add(null, null, t.Rows[i]["GUID"], Guid.NewGuid(), t.Rows[i]["SalesPrice"], t.Rows[i]["Amount"], true, "jsjd"); } sda.Update(ds, "product"); public void UpdateDataSet(DataSet ds, string tableName, SqlCommand insertCommand, SqlCommand updateCommand, SqlCommand deleteCommand) { using (SqlConnection conn = this.CretaeSqlConnection()) { conn.Open(); using (SqlTransaction transaction = conn.BeginTransaction()) { if(insertCommand == null && updateCommand == null && deleteCommand ==null){ throw new Exception("insertCommand updateCommand deleteCommand 不能全部為空"); } using (SqlDataAdapter dapter = new SqlDataAdapter()) { if (insertCommand != null) { insertCommand.Connection = conn; insertCommand.Transaction = transaction; dapter.InsertCommand = insertCommand; } if (updateCommand != null) { updateCommand.Connection = conn; updateCommand.Transaction = transaction; dapter.UpdateCommand = updateCommand; } if (deleteCommand != null) { deleteCommand.Connection = conn; deleteCommand.Transaction = transaction; dapter.DeleteCommand = deleteCommand; } try { dapter.Update(ds, tableName); transaction.Commit(); } catch (SqlException ex) { transaction.Rollback(); throw ex; } } } } }
[解决办法]
//执行事务处理public void DoTran(){ //建立连接并打开 SqlConnection myConn=GetConn(); myConn.Open(); SqlCommand myComm=new SqlCommand(); //SqlTransaction myTran=new SqlTransaction(); //注意,SqlTransaction类无公开的构造函数 SqlTransaction myTran; //创建一个事务 myTran=myConn.BeginTransaction(); try { //从此开始,基于该连接的数据操作都被认为是事务的一部分 //下面绑定连接和事务对象 myComm.Connection=myConn; myComm.Transaction=myTran; //定位到pubs数据库 myComm.CommandText="USE pubs"; myComm.ExecuteNonQuery();//操作1 myComm.CommandText=""; //操作2 myComm.ExecuteNonQuery(); //提交事务 myTran.Commit(); } catch(Exception err) { myTran.rollback(); throw new ApplicationException("事务操作出错,系统信息:"+err.Message); } finally { myConn.Close(); }}
------解决方案--------------------
// 事务准备 OracleTransaction tran = null; OracleConnection conn = new OracleConnection(); conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["CMSPMSDBConnectionString"].ConnectionString; try { // 数据库操作 conn.Open(); tran = conn.BeginTransaction(); OracleTableAdapterHelper.SetTransaction(ta, tran);//设置事务 ta.P_INSERTCAR(Guid.NewGuid().ToString(), TextBoxCPH.Text, TextBoxXLH.Text, DropDownListPro.SelectedItem.Text + "/" + DropDownListCity.SelectedItem.Text, sysUser.Number, sysUser.Corp.ID); devicemanage.AddDeviceInterface(WebPublic.GetAppCheckID(), CHECKBOXLISTDEVSTATE.SelectedValue, TextBoxXLH.Text); WebAction.AjaxMessageBox(this, "ExiD", "新增成功!"); Response.Redirect(string.Format(@"~/Action/CarManager.aspx")); } catch (Exception ex) { // 事务回滚 tran.Rollback(); WebAction.AjaxMessageBox(this, "ExiD", "更新数据失败!\n" + ex.Message); } finally { OracleConnection.ClearPool(conn); conn.Close(); Response.Redirect(string.Format(@"~/Action/CarManager.aspx")); }