2017-09-05 35 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. 
    }