【发布时间】:2020-11-14 11:59:30
【问题描述】:
我正在为我的大学期末项目开发一个程序,该程序包括从一个固定文件夹中获取几个 SQL 脚本并执行它们。在与我的项目主管会面时,他说最好确保如果在运行其中一个脚本时检测到错误,程序应该停止运行脚本并停止。而且我在检测到错误后停止程序的部分有问题。帮助将不胜感激。 顺便说一句,这一切都是在 C# (WindowsFormsApp(.NET Framework)) 中完成的。 我展示的脚本完美运行。
public string ExecuteFiles(string connectionString, string fileName)
{
var result = string.Empty;
//var error = ">> [" + MethodBase.GetCurrentMethod().Name + "]\n";
try
{
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Updates", fileName);
string script = File.ReadAllText(path);
using (SqlConnection connection = new SqlConnection(connectionString))
{
Logger.Debug("Script a ser executado: " + fileName);
connection.Open();
Server server = new Server(new Microsoft.SqlServer.Management.Common.ServerConnection(connection));
server.ConnectionContext.ExecuteNonQuery(script);
Logger.Debug("Script executado: " + fileName);
}
}
catch (Microsoft.SqlServer.Management.Common.ConnectionFailureException cfe)
{
Logger.Error("Message: " + cfe);
lblmsg.Text = ">> [Message] => " + cfe.Message + "\n";
}
catch (SmoException se)
{
Logger.Error("Message: " + se);
lblmsg.Text = ">> [Message] => " + se.Message + "\n";
}
catch (Exception ex)
{
Logger.Error("Message: " + ex);
lblmsg.Text = ">> [Message] => " + ex.Message + "\n";
if (ex.InnerException is SqlException)
{
SqlException sqlex = (SqlException)ex.InnerException;
lblmsg.Text = ">> [Message] => " + sqlex.Message + "\n";
Logger.Error("Message: " + sqlex);
}
}
return result;
}
【问题讨论】:
-
你试过 ex.Throw in your catch 吗?
-
您描述问题的方式我假设您在循环中调用此方法,其中您有一堆文件。如果您想取消该循环中剩下的所有内容,请按照@Mikael 所说的那样做。如果你想取消到目前为止已经完成的所有事情,你需要在单个事务中重新处理所有内容,并在单个错误上回滚
-
你需要展示这个函数是如何被调用的,以便告诉你如何在一个脚本失败时停止它。
-
@Mikael 你介意举个例子来指导一下吗?
-
我正在开会,所以我在手机上打字。请原谅格式。在您的 catch(exception ex) 块中,执行所有日志记录,然后在最后键入 Throw.ex;这将引发致命错误并停止程序继续运行。您可能需要在抛出错误之前编写日志
标签: c# sql visual-studio winforms