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