好的,所以我有一个webform和5个FileUpload控件..用户可以上传任意数量的文件从1到5,但如果这些文件中的任何一个没有上传,那么我想要回滚所有内容...... 例如: 如果用户选择了4个文件,如果在第4个时发生了意外情况,那么我想删除或回滚之前的3个文件上传内容。 我试过了..
try
{
using (TransactionScope scope = new TransactionScope())
{
dboperation dbinsert=new dboperation();
if (file1.ContentLength > 0)
{
.......
.......
dbo.insert(bytes, lastid, file2.FileName);
}
if (file2.ContentLength > 0)
{
.......
.......
dbo.insert(bytes, lastid, file2.FileName);
}
if (file3.ContentLength > 0)
{
.......
.......
dbo.insert(bytes, lastid, file2.FileName);
}//till ...file5
scope.Complete();
}//end of transactionscope
}
catch { }
'dboperation'是c#文件中的类,'dbinsert'是执行插入存储过程的方法。我的猜测是我需要使用交易范围,但我不确定我是否正确,即使我是如何实现这一目标的呢?
答案 0 :(得分:2)
您需要实施transaction。您应该在插入第一个事务之前启动事务并捕获发生的任何错误。如果出现错误,您必须回滚事务。如果一切顺利,您可以提交交易。
您还应该在dboperation之外移动连接,或者在dboperation中创建一个从外部获取连接并使用该方法的方法
答案 1 :(得分:1)
为此你需要使用Transaction
之类的东西。我举个例子。
class WithTransaction
{
public WithTransaction()
{
string FirstQuery = "INSERT INTO Table1 VALUES('Vineeth',24)";
string SecondQuery = "INSERT INTO Table2 VALUES('HisAddress')";
int ErrorVar = 0;
using (SqlConnection con = new SqlConnection("your connection string"))
{
try
{
SqlCommand ObjCommand = new SqlCommand(FirstQuery, con);
SqlTransaction trans;
con.Open();
trans = con.BeginTransaction();
ObjCommand.Transaction = trans;
//Executing first query
//What ever operation on your database do here
ObjCommand.ExecuteNonQuery(); //Exected first query
ObjCommand.CommandText = SecondQuery;
ObjCommand.ExecuteNonQuery(); //Exected first query
//Everything gone fine. So commiting
ObjCommand.Transaction.Commit();
}
catch (Exception ex)
{
Console.WriteLine("Error but we are rollbacking");
ObjCommand.Transaction.Rollback();
}
con.Close();
}
}
}
或者您可以使用TransactionScope
检查此链接
我希望这会对你有所帮助。