/// <summary> /// /// </summary> public void Determine(){ using (var connection = new DatabaseConnectionProvider().GetConnection(_context.SqlConnectionString)){ connection.Open(); var exproc = connection.ExecuteScalar<int>("select object_id('" + _context.MetadataTable + "')"); if (0 == exproc){ throw new Exception("В целевой БД отсутвует таблица "+_context.MetadataTable); } var currev = connection.ExecuteScalar<string>("select ActiveRevisionRevision from " + _context.MetadataTable + "Full where Code='" + _context.ProjectName + ".project'"); _context.GitBaseRevision = currev; } }
/// <summary> /// /// </summary> public void Update() { using (var connection = new DatabaseConnectionProvider().GetConnection(_context.SqlConnectionString)) { connection.Open(); var exproc = connection.ExecuteScalar<int>("select object_id('" + _context.MetadataTable + "Register')"); if (0 == exproc) { throw new Exception("В целевой БД отсутвует процедура " + _context.MetadataTable+"Register"); } //сначала надо прорегистрировать скрипт, и только потом его выполнять, так как на него могут идти ссылки var register = "exec " + _context.MetadataTable + "Register @code=@code,@name=@code,@content=@content, @hash=@hash,@revision=@revision,@filetime=@filetime,@comment=@comment"; connection.ExecuteNonQuery(register, new { code = _context.ProjectName + ".project",comment=_context.FullUpdate||!_context.GitBaseRevision.ToBool()?"full":"diff", content = string.Join("\r\nGO\r\n", _context.SqlScripts), filetime = DateTime.Now, hash = _context.ResolvedUpdateRevision, revision = _context.ResolvedUpdateRevision.Substring(0, 7) }); if (_context.OnlyRegister){ _context.Log.Trace("Включен режим 'только регистрация', сам скрипт обновления не выполняется"); } else{ foreach (var script in _context.SqlScripts){ _context.Log.Trace("Begin ExecuteSql : '"+script.Substring(0,Math.Min(100,script.Length))+"' at "+DateTime.Now.ToString()); connection.ExecuteNonQuery(script, timeout: 30000); _context.Log.Trace("End ExecuteSql : '" + script.Substring(0, Math.Min(100, script.Length)) + "' at " + DateTime.Now.ToString()); } } } }