Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果出现错误,有没有办法停止运行SQL脚本?_C#_Sql_Visual Studio_Winforms - Fatal编程技术网

C# 如果出现错误,有没有办法停止运行SQL脚本?

C# 如果出现错误,有没有办法停止运行SQL脚本?,c#,sql,visual-studio,winforms,C#,Sql,Visual Studio,Winforms,我正在为我大学的最后一个项目开发一个程序,包括从一个固定文件夹中提取几个SQL脚本并执行它们。在与我的项目主管的一次会议上,他说,如果在运行其中一个脚本时检测到错误,那么程序应该停止运行脚本并停止,这将是一个好主意。我在程序检测到错误后停止程序的部分遇到了问题。非常感谢您的帮助。 顺便说一句,这一切都是在C#(WindowsFormsApp(.netframework))中完成的。 我正在展示的剧本非常完美 public string ExecuteFiles(string co

我正在为我大学的最后一个项目开发一个程序,包括从一个固定文件夹中提取几个SQL脚本并执行它们。在与我的项目主管的一次会议上,他说,如果在运行其中一个脚本时检测到错误,那么程序应该停止运行脚本并停止,这将是一个好主意。我在程序检测到错误后停止程序的部分遇到了问题。非常感谢您的帮助。 顺便说一句,这一切都是在C#(WindowsFormsApp(.netframework))中完成的。 我正在展示的剧本非常完美

        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)

窗口将首先提示错误消息,然后退出程序

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

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;这将抛出一个致命错误并停止程序继续。在抛出错误之前,您可能需要编写日志,尽管这充其量是迟钝的。这是一个更好的主意