2017-09-05 33 views
0

我在ASP.NET MVC中使用插入存儲過程並上傳文件時遇到問題。
ASP.NET MVC - EF存儲過程和文件上傳。沒有回滾

我在try-catch塊三個部分組成:

  1. 生成的文件名。
  2. 執行插入存儲過程。
  3. 保存文件。

生成文件名,將該文件名插入到數據庫中並保存具有該名稱的文件。

問題:

如果在執行插入存儲過程成功文件保存失敗,插入的行仍然導致沒有照片的事件。

如果我切換順序,先保存文件,然後插入到數據庫中,該問題仍然存在。如果文件保存成功 S和插入失敗,有沒有活動的照片。

示例代碼(只是一個例證)。

try 
{ 
    //Generate a new file name. 
    var newFileName = Guid.NewGuid().ToString(); 

    //Execute stored procedore. 
    Database.Insert_Event(newFileName, title, description, dateTime); 

    //Save event photo. 
    eventPhoto.SaveAs(newFileName); 
} 
catch (DataException exception) 
{ 
    //Exception message when executing insert SP. 
} 
catch (IOException exception) 
{ 
    //Exception message when saving file. 
} 

問:

使用存儲過程,如果該文件保存失敗或如何恢復文件的保存,如果插入失敗插入時如何恢復數據庫插入?

回答

2

最好的辦法是先保存文件,然後插入到數據庫中。

所以我已經做了以下就是我們的文件保存到我們的新路徑(newFileName)。如果文件沒有保存,異常將被捕獲到我們的catch語句中。接下來,如果一切順利,我們檢查文件是否存在於我們的新路徑中,我們執行存儲過程。

雖然執行存儲過程,如果我們面對一個錯誤,將在我們的catch語句捕獲並會有插入到數據庫的數據,我們會從我們的新的路徑刪除文件不留它的蹤影。

這將涵蓋您的問題的兩種情況。

//Generate a new file name. 
    var newFileName = Guid.NewGuid().ToString(); 
    try 
    {  
     //Save event photo. 
     eventPhoto.SaveAs(newFileName); 

     //checks if file exists at the new path 
     if(File.Exists(newFileName)){ 
      //Execute stored procedore. 
      Database.Insert_Event(newFileName, title, description, dateTime); 
     } 
    } 
    catch (DataException exception) 
    { 
     //Exception message when executing insert SP. 
     // Remove the saved file 
     if(File.Exists(newFileName)){ 
      File.Delete(newFileName) 
     } 
    } 
    catch (IOException exception) 
    { 
     //Exception message when saving file. 
    }