简单实现主从非约束表的事务处理提交(多表多记录)

最近做个项目,其中碰到个问题,就是主从非约束表的提交...
主表一条记录同多个子表多行记录一同提交,不能出现问题,出现问题就全部回滚。
好现在说下主要处理方法吧,我不习惯讲东西讲很详细,一般说下重点就可以了,写程序主要是一个清晰简洁的流程。

1.考虑实现事务处理
2.考虑多行的datagrid提交

1.假定一次提交3个表,1个主表1条记录,2个子表各3条记录,子表用DataGrid实现。
那么建立3个执行insert的存储过程,这3个存储过程要在事务之中一起实现。
    myConn.Open ();
    SqlCommand mySelectCommand=new SqlCommand();
    SqlTransaction myTran;
    myTran=myConn.BeginTransaction();
    mySelectCommand.Connection =myConn;
    mySelectCommand.Transaction =myTran;
//事务开始
    mySelectCommand.CommandText =SQL_Proc_A;
    mySelectCommand.CommandType =CommandType.StoredProcedure ;
    mySelectCommand.Parameters.Add (new SqlParameter ("@A1",SqlDbType... ));
    mySelectCommand.Parameters ["@A1"].Value =A1;     
    mySelectCommand.ExecuteNonQuery ();
//1个
    mySelectCommand.CommandText =SQL_Proc_B;
    mySelectCommand.CommandType =CommandType.StoredProcedure ;
    mySelectCommand.Parameters.Clear();
    mySelectCommand.Parameters.Add (new SqlParameter ("@B1",SqlDbType... ));
    mySelectCommand.Parameters ["@B1"].Value =B1;     
    mySelectCommand.ExecuteNonQuery ();
//2个
    mySelectCommand.CommandText =SQL_Proc_C;
    mySelectCommand.CommandType =CommandType.StoredProcedure ;
    mySelectCommand.Parameters.Clear();
    mySelectCommand.Parameters.Add (new SqlParameter ("@C1",SqlDbType... ));
    mySelectCommand.Parameters ["@C1"].Value =C1;     
    mySelectCommand.ExecuteNonQuery ();
//3个
   try
    {
     myTran.Commit(); 
    myConn.Close ();
    }
    catch(Exception ex)
    {
     myTran.Rollback ();
     throw new ApplicationException("Tran Error:"+ex.Message);
    }
//事务结束

2.使用Session保存多行子表
大家可以参考这个:
http://www.channel7.cn/2004/12-27/221912.html

3.我这里主要是说事务处理,所以再说下是如何把Session中的table被事务处理中存储过程使用
首先得到 Session中的Table:
主表不放在Session中的,它只有一条记录的。
DataTable dtTableB=(DataTable)Session[TableB];
DataTable dtTableC=(DataTable)Session[TableC];

写个调用事务的方法 tranSet(DataTable dtTableB,DataTable dtTableC,SqlParameter[] sqlPara)
SqlParameter[] sqlPara 是传递主表的
tranSet()的内容就是1.

在方法中修改table参数的处理是:
    for (int i=0;i<dtTableB.Rows .Count;i++)
    {
     dr[i]=dtTableB.Rows [i]; 
     mySelectCommand.Parameters ["@B1"].Value =dr[i][Field].ToString();     
    }

好了,这样对3个表的处理都在一个事务中,这样就能保证数据的完整了。

事务处理会影响性能,但对这类多表多记录是必须的。

转载于:https://www.cnblogs.com/BoKeRen/archive/2006/04/26/385632.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值