Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果尚未上载所有文件,如何回滚_C#_Asp.net_Sql_Sql Server_Ado.net - Fatal编程技术网

C# 如果尚未上载所有文件,如何回滚

C# 如果尚未上载所有文件,如何回滚,c#,asp.net,sql,sql-server,ado.net,C#,Asp.net,Sql,Sql Server,Ado.net,好的,我有一个webform和5个FileUpload控件。用户可以上传1到5个任意数量的文件,但是如果这些文件中的任何一个没有被上传,那么我想回滚所有内容。。。 例如: 如果用户选择了4个文件,并且在第4个文件出现意外情况,则我希望删除或回滚之前的3个文件上载。。 我试过这个 try { using (TransactionScope scope = new TransactionScope()) { dboperation dbinsert=new db

好的,我有一个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”是一个执行insert存储过程的方法。我的猜测是我需要使用事务范围,但我不确定我是否正确,即使我是正确的,我应该如何实现这一点?

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


您还应该将连接移到dboperation之外,或者在dboperation中创建一个从外部获取连接并使用该连接的方法。为此,您需要使用类似这样的
事务。我给你举个例子

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

检查此链接


我希望这对你有帮助

首先检查所有文件是否正确上载,如果有任何进一步的错误,请使用事务和回滚。删除try和事务后,它工作正常。查看我的代码。我已经尝试过了,但没有成功。。可能是我实施的方式不对。。查看我的代码,我已经更新了它。在catch中,您需要回滚事务。如何回滚?如果出现错误,它不应该自动回滚吗?为什么它在没有理由中止的情况下首先被中止。这有用吗。。已禁用分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具在MSDTC的安全配置中为网络访问启用DTC。您正在打开多个与数据库的连接。。。请检查这个问题[TransactionScope)谢谢你的回答,但我的情况并没有那么简单。我已经用我在问题中提到的代码实现了事务。你也可以在这里实现该代码。你必须将你的事务传递给你的类。在我的代码的try-catch块中写下你的代码,我会在其中添加注释。请看一看。或者你可以告诉我们电子交易范围。请查看此帖子