/// <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()); } } } }