C# 如果出现错误,有没有办法停止运行SQL脚本?
我正在为我大学的最后一个项目开发一个程序,包括从一个固定文件夹中提取几个SQL脚本并执行它们。在与我的项目主管的一次会议上,他说,如果在运行其中一个脚本时检测到错误,那么程序应该停止运行脚本并停止,这将是一个好主意。我在程序检测到错误后停止程序的部分遇到了问题。非常感谢您的帮助。 顺便说一句,这一切都是在C#(WindowsFormsApp(.netframework))中完成的。 我正在展示的剧本非常完美C# 如果出现错误,有没有办法停止运行SQL脚本?,c#,sql,visual-studio,winforms,C#,Sql,Visual Studio,Winforms,我正在为我大学的最后一个项目开发一个程序,包括从一个固定文件夹中提取几个SQL脚本并执行它们。在与我的项目主管的一次会议上,他说,如果在运行其中一个脚本时检测到错误,那么程序应该停止运行脚本并停止,这将是一个好主意。我在程序检测到错误后停止程序的部分遇到了问题。非常感谢您的帮助。 顺便说一句,这一切都是在C#(WindowsFormsApp(.netframework))中完成的。 我正在展示的剧本非常完美 public string ExecuteFiles(string co
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;
}
您可以添加代码
System.Environment.Exit(0)在try块中抛出错误时,在catch语句中使用code>
窗口将首先提示错误消息,然后退出程序
您可以尝试使用以下代码替换它:
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.Message);
lblmsg.Text = ">> [Message] => " + cfe.Message + "\n";
System.Environment.Exit(0);
}
catch (SmoException se)
{
Logger.Error("Message: " + se);
lblmsg.Text = ">> [Message] => " + se.Message + "\n";
System.Environment.Exit(0);
}
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);
System.Environment.Exit(0);
}
}
return result;
}
结果:
您是否尝试过ex.Throw in your catch?您描述问题的方式我假设您在一个循环中调用此方法,其中有一堆文件。如果你想取消循环中剩下的所有内容,就按照@Mikael说的去做。如果要取消迄今为止已完成的所有操作,您需要在一个事务中对所有操作进行返工,并在一个错误上回滚。您需要显示如何调用此函数,以便在一个脚本失败时建议您如何停止它。@Mikael您介意举个示例作为指导吗?我正在开会,所以我正在键入我的脚本可移动的请原谅格式错误。在catch(exception ex)块中,执行所有日志记录,然后在末尾键入Throw.ex;这将抛出一个致命错误并停止程序继续。在抛出错误之前,您可能需要编写日志,尽管这充其量是迟钝的。这是一个更好的主意