1

好的,所以我有一个网络表单和 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' 是一个执行插入存储过程的方法。我的猜测是我需要使用事务范围,但我不确定我是否正确,即使我应该如何实现这一目标?

4

2 回答 2

2

您需要实现事务。您应该在插入第一个事务之前启动事务并捕获发生的任何错误。如果出现错误,您必须回滚事务。如果一切顺利,您可以提交您的交易。

您还应该将连接移到 dboperation 之外,或者在 dboperation 中创建一个从外部获取连接并使用该连接的方法

于 2013-08-27T09:58:10.600 回答
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

检查此链接

交易范围

我希望这能帮到您。

于 2013-08-27T11:07:27.603 回答