坐标地址

看清楚-----那个飞的风筝才是我

 

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

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

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个表的处理都在一个事务中,这样就能保证数据的完整了。

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





posted on 2006-04-26 00:03  Augur  阅读(1066)  评论(1编辑  收藏  举报

导航