Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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
SMO事务通过C#代码失败_C#_Sql_Sql Server 2008_Smo_Sqltransaction - Fatal编程技术网

SMO事务通过C#代码失败

SMO事务通过C#代码失败,c#,sql,sql-server-2008,smo,sqltransaction,C#,Sql,Sql Server 2008,Smo,Sqltransaction,我们有很多SQL脚本文件,我们正试图通过C#代码执行这些文件 场景: 我们希望在SQL Server上执行所有脚本文件。如果成功执行 然后所有脚本提交事务,否则回滚所有内容 如果文件执行成功,则将其记录在表中,以便 不要再捡了 我们希望保持所有脚本的执行,以便一次捕获所有文件中的错误(如果有)。但如果出现任何异常,则所有文件代码都不应得到提交。 更多信息:如果所有脚本都成功执行,然后Commit工作正常,则运行良好。但是,如果两个脚本之间有任何脚本出现故障,则默认情况下,在脚本出现故障异常时,系

我们有很多SQL脚本文件,我们正试图通过C#代码执行这些文件

场景:

  • 我们希望在SQL Server上执行所有脚本文件。如果成功执行 然后所有脚本提交事务,否则回滚所有内容
  • 如果文件执行成功,则将其记录在表中,以便 不要再捡了
  • 我们希望保持所有脚本的执行,以便一次捕获所有文件中的错误(如果有)。但如果出现任何异常,则所有文件代码都不应得到提交。
  • 更多信息:如果所有脚本都成功执行,然后
    Commit
    工作正常,则运行良好。但是,如果两个脚本之间有任何脚本出现故障,则默认情况下,在脚本出现故障异常时,系统将回滚到目前为止成功执行的所有脚本,我们将获得一个新的连接(自动)来执行其余的脚本。在保留成功执行的每个单独文件之后,我们不希望自动提交(因为整个目的是,只有当所有脚本都成功执行时,提交才能工作)

    另一个问题:假设script-2是主
    DDL
    script,script-7是script-2上的
    DML
    语句。现在,若script-5上发生异常,那个么系统将回滚所有脚本,直到5,我们将自动获得一个新连接(我们不希望这样,我们希望只完成一个事务)。对于script-6,它可以正常工作,但是对于script-7,它会抛出错误,因为script 7依赖于已经回滚的script 2。但这是错误的。脚本2已成功执行,并在脚本5失败时强制回滚。所以,如果script-5没有问题,那么script-7就会成功执行。现在我们将看到script-7上的错误,这需要开发人员花费时间来修复,但根本没有错误,可能还会有更多这样的脚本

    C#代码

    public dynamic ProcessScripts(string[] files, String _sqlconString, String DatabaseName)
    {
        string _buildNumber = Convert.ToString(System.Configuration.ConfigurationManager.AppSettings["BuildNumber"]).Trim();
        dynamic objReturn = new ExpandoObject();
        objReturn.IsExceptionOccured = false;
        objReturn.DBName = "";
        FileInfo file = null;
        bool IsExceptionOccured = false;
        string script = string.Empty;
        string InsertScript = string.Empty;
        SqlConnection _sqlconnection = new SqlConnection(_sqlconString);
        ServerConnection _ServerConnection = new ServerConnection(_sqlconnection);
        Server _serverk = new Server(_ServerConnection);
        _serverk.ConnectionContext.BeginTransaction();
    
        String _QueryString = string.Empty;
    
        foreach (string s in files)
        {
            file = new FileInfo(s);
            String FileName = file.Name.ToLower().Trim();
            script = file.OpenText().ReadToEnd();
            if (script.Trim() != string.Empty)
            {
                try
                {
                    InsertScript = nl+"GO "+nl+" INSERT INTO [LOGTable] (FileName,STATUS,BUILD_NO) VALUES ('" + Path.GetFileName(s.ToString()) + "','success','" + _buildNumber + "');  "+nl+"GO "+nl;
                    _QueryString = FindAndReplace(script) + InsertScript;
                    _serverk.ConnectionContext.ExecuteNonQuery(_QueryString);
                    WriteLog(LogType.Execution, DatabaseName, null, "Execution succeed ", FileName);
                }
    
                catch (Exception ex)
                {
                    string _Msg = string.Empty;
                    if (ex.InnerException != null)
                        _Msg = ex.InnerException.Message;
                    else
                        _Msg = ex.Message;
                    WriteLog(LogType.Execution, DatabaseName, new Exception(_Msg), "Execution Failed", FileName, "");
                    objReturn.IsExceptionOccured = true;
                }
            }
        }
        if (objReturn.IsExceptionOccured)
        {
            _serverk.ConnectionContext.RollBackTransaction();
        }
        else
        {
            _serverk.ConnectionContext.CommitTransaction();
        }
    
        return objReturn;
    
    }