简单实现主从非约束表的事务处理提交(多表多记录)
最近做个项目,其中碰到个问题,就是主从非约束表的提交...
主表一条记录同多个子表多行记录一同提交,不能出现问题,出现问题就全部回滚。
好现在说下主要处理方法吧,我不习惯讲东西讲很详细,一般说下重点就可以了,写程序主要是一个清晰简洁的流程。
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个表的处理都在一个事务中,这样就能保证数据的完整了。
事务处理会影响性能,但对这类多表多记录是必须的。