我要把三个对于不同表Table1,Table2,Table3的操作整体作为一个事务处理,真对于这三个表有三个存储过程 Procedure1,Procedure2,Procedure3,而且每个存储过程的参数都不相同,我想问:1. 我觉得可以把三个存储过程合并起来,在存储过程中添加事务,这样做,在访问量较多的时候会不会出现问题。2. 我怎样在.net中添加事务,因为有三个存储过程,我需要建立三个Command对象,那么我能这样写吗?
……
SqlTransaction trans=con.BeginTransaction();
SqlComm1.Transaction=trans;
SqlComm2.Transaction=trans;
SqlComm3.Transaction=trans; try
{
SqlComm1.ExecuteNonQuery();
SqlComm2.ExecuteNonQuery();
SqlComm3.ExecuteNonQuery();
trans.Commit();
}
catch
{
trans.Rollback();
}像我刚才的解决方法,大家平时都是怎么做的,还有其他的写法吗?
……
SqlTransaction trans=con.BeginTransaction();
SqlComm1.Transaction=trans;
SqlComm2.Transaction=trans;
SqlComm3.Transaction=trans; try
{
SqlComm1.ExecuteNonQuery();
SqlComm2.ExecuteNonQuery();
SqlComm3.ExecuteNonQuery();
trans.Commit();
}
catch
{
trans.Rollback();
}像我刚才的解决方法,大家平时都是怎么做的,还有其他的写法吗?
解决方案 »
- 小数点的控制
- 关于get和set
- .NET函数的写法
- 这个是什么原因?我在自己电脑上测试不会出现问题,在别的电脑上就提示这个!
- 如何实现二维数组之间复制??
- 对象如何存入文件
- 如何让一上框内的页面控制另一框架显示(关联)的页面??
- 在VB.net 中如何执行批处理文件?
- DATAGRID里怎么判断双击的地方是列抬头?
- UI测试录制时,提示访问被拒绝
- 十万火急请教Xml WebService配置问题,为什么我的老是出现Running the project requires setting an initial Web page. To set this page,
- 关于打印机的问题。都来说说。~~~
try
{
SqlComm1.Transaction=trans;
SqlComm1.commandtype = ....;SqlComm1.CommandText = proc1;
SqlComm1.ExecuteNonQuery();SqlComm1.CommandText = proc2;
SqlComm1.ExecuteNonQuery();SqlComm1.CommandText = proc3;
SqlComm1.ExecuteNonQuery(); trans.Commit();
}
catch
{
trans.Rollback();
}
SqlComm1.Transaction=trans;
SqlComm2.Transaction=trans;
SqlComm3.Transaction=trans;给个示例看看,这是最基本写法
protected int RunTransaction3(string procname1,string procname2,string procname3,IDataParameter[] para1,ArrayList ParaArray2,ArrayList ParaArray3)
{
//事务保证3个存储过程同步
SqlCommand command1=BuildCommand(procname1); Connection.Open(); SqlTransaction myTrans = Connection.BeginTransaction(); command1.Transaction = myTrans; try
{
int result1=0;
foreach(SqlParameter parameter in para1)
{
command1.Parameters.Add(parameter);
}
command1.Parameters.Add("@io_ErrorID",SqlDbType.Int,4);
command1.Parameters["@io_ErrorID"].Direction=ParameterDirection.Output;
command1.ExecuteNonQuery();
result1=(int)command1.Parameters["@io_ErrorID"].Value;
if(result1!=1)
{
myTrans.Rollback(); return -1;
} int result2=0;
int error=0;
command1.CommandText=procname2;
foreach(object para in ParaArray2)
{
command1.Parameters.Clear();
IDataParameter[] parameters=(IDataParameter[])para;
foreach(SqlParameter parameter in parameters)
{
command1.Parameters.Add(parameter);
}
command1.Parameters.Add("@ErrorID",SqlDbType.Int,4);
command1.Parameters["@ErrorID"].Direction=ParameterDirection.Output;
command1.ExecuteNonQuery();
result2=(int)command1.Parameters["@ErrorID"].Value;
if(result2!=1)
error=1;
}
if(error==1
{
myTrans.Rollback();
return -1;
} int result3=0; command1.CommandText=procname3;
foreach(object para in ParaArray3)
{
command1.Parameters.Clear();
IDataParameter[] parameters=(IDataParameter[])para;
foreach(SqlParameter parameter in parameters)
{
command1.Parameters.Add(parameter);
}
command1.Parameters.Add("@ErrorID",SqlDbType.Int,4);
command1.Parameters["@ErrorID"].Direction=ParameterDirection.Output;
command1.ExecuteNonQuery();
result3=(int)command1.Parameters["@ErrorID"].Value;
if(result3!=1)
error=1;
}
if(error==1)//失败,回滚
{
myTrans.Rollback();
return -1;
}
myTrans.Commit();
return 1;
} catch(Exception ee)
{
try
{
string str=ee.Message;
myTrans.Rollback();
return -1;
//result=-1;
}
catch (SqlException ex)
{
string str1=ex.Message;
return -1;
//result=-1;
} }
finally
{
Connection.Close(); } }