【问题标题】:Is there a way to stop running SQL scripts if we get an error? [duplicate]如果出现错误,有没有办法停止运行 SQL 脚本? [复制]
【发布时间】: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


【解决方案1】:

当 try 块中抛出错误时,您可以在 catch 语句中添加代码 System.Environment.Exit(0);

窗口会先提示错误信息,然后退出程序。

您可以尝试以下代码来替换它:

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;
        }

结果:

【讨论】:

猜你喜欢
  • 2011-01-06
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 2019-07-02
相关资源
最近更新 更多