当我使用插入存储过程并在ASP.NET MVC中上传文件时,我遇到了问题。
我的try-catch块中有三个部分:
生成文件名,将该文件名插入数据库并保存具有该名称的文件。
问题:
如果执行插入存储过程成功且文件保存失败,插入的行仍然会保留,导致没有照片的事件。
如果我切换订单,首先保存文件然后插入数据库,问题仍然存在。如果文件保存成功且插入失败,则会显示没有该事件的照片。
示例代码(仅举例说明)。
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.
}
问题:
如果文件保存失败,如何在使用存储过程插入时还原数据库插入,或者如果插入失败,如何还原文件保存?
答案 0 :(得分: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.
}