2013-08-27 3 views
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» - это метод, который выполняет хранимую процедуру вставки. Я предполагаю, что мне нужно использовать Transaction Scope, но я не уверен, что я прав, и даже если я, как я должен это достичь?

+1

Проверьте, все ли файлы загружены правильно ** сначала **, используйте транзакцию и откат, если есть дополнительные ошибки – wudzik

+0

при удалении попытки и транзакции, она отлично работает. См. Мой код. – Arbaaz

ответ

2

Вам необходимо ввести transaction. Вы должны начать транзакцию, прежде чем вставлять первую и улавливать любые возникающие ошибки. в случае ошибки вам придется отменить транзакцию. И если все будет хорошо, вы можете совершить транзакцию.

Вы также должны переместить вас соединение вне dboperation или сделать метод в dboperation, который принимает соединения извне и использует, что

+0

Я уже пробовал это, но это не сработало. Возможно, я внедряю его неправильно. См. Мой код, я его обновил. – Arbaaz

+0

в уловах вам нужно откат вашей транзакции. – Ehsan

+0

Как? и разве он не должен откатываться назад, если есть ошибка? почему он прерывается в первую очередь, когда нет причин для его прекращения. – Arbaaz

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

Проверить эту ссылку

TransactionScope

Я надеюсь, что это поможет.

+0

Спасибо за ваш ответ, но моя ситуация не такая простая. Я выполнил транзакцию по коду, о котором я упоминал. – Arbaaz

+0

вы также можете реализовать этот код здесь. вы должны передать свою транзакцию своему классу. напишите вам код в try catch block моего кода, где я помещаю комментарий. посмотрите пожалуйста. –

+0

Или вы также можете использовать область транзакций. проверьте этот пост http://www.dotnetfunda.com/articles/article70.aspx http://codingcramp.blogspot.com.au/2009/06/how-to-setup-and-use-transactionscope.html –

Смежные вопросы