/// <summary> /// Executes the current collection of registered commands /// </summary> /// <remarks> /// Opens the connection, begins a transaction, initializes all command, then executes each command. Finally commits transaction. /// Upon failure, transaction is rolled-back. Null commands automatically return 1 for execution. /// </remarks> /// <returns>List of integers returned from each registered command</returns> public List <int> Execute() { List <int> retVal = new List <int>(); using (Microsoft.Data.SqlClient.SqlConnection conn = new Microsoft.Data.SqlClient.SqlConnection(_ConnectionString)) { conn.Open(); Microsoft.Data.SqlClient.SqlTransaction trans = conn.BeginTransaction(); try { int initialized = _Commands.Count; for (int i = 0; i < initialized; i++) { if (_Commands[i] != null) { _Commands[i].Initialize(conn, trans); } } for (int i = 0; i < _Commands.Count; i++) { if (_Commands[i] != null) { // This following line allows for chaining. // in other words, a executing command can add more commands. if (i >= initialized) { _Commands[i].Initialize(conn, trans); } retVal.Add(_Commands[i].Execute()); } else { retVal.Add(1); } } trans.Commit(); } catch (Exception) { try { trans.Rollback(); } catch (Exception) { } throw; } finally { _Commands.Clear(); } } return(retVal); }
private void CorrigirOrdens(long idSuperior) { var itens = Filter(item => item.IdSuperior == idSuperior).OrderBy(it => it.Ordem).ToList(); var strBuilder = new StringBuilder(); short ordem = 0; foreach (var it in itens) { ordem++; if (ordem != it.Ordem) { strBuilder.AppendLine($"update ProjetoEstruturaOrganizacional set Ordem = {ordem} where Id = {it.Id};"); } } if (strBuilder.Length > 0) { Exception excSql = null; using var connection = new Microsoft.Data.SqlClient.SqlConnection(databaseContext.Database.GetDbConnection().ConnectionString); connection.Open(); var transaction = connection.BeginTransaction(); using (var command = new Microsoft.Data.SqlClient.SqlCommand(strBuilder.ToString(), connection, transaction)) { try { command.ExecuteNonQuery(); transaction.Commit(); } catch (Exception exc) { excSql = exc; transaction.Rollback(); } } connection.Close(); if (excSql != null) { throw excSql; } } }
protected override void AfterUpdate(Indicador oldValue, Indicador newValue) { if (oldValue.Identificador != newValue.Identificador && oldValue.TipoCalculo == TipoCalculo.NaoCalculado) { Exception excSql = null; string termoPesquisa = $"[{oldValue.Identificador}]"; string novoIdentificador = $"[{newValue.Identificador}]"; using var connection = new Microsoft.Data.SqlClient.SqlConnection(databaseContext.Database.GetDbConnection().ConnectionString); connection.Open(); var transaction = connection.BeginTransaction(); string sqlUpdate = $"update Indicador set Formula = replace(Formula, '{termoPesquisa}', '{novoIdentificador}') where TipoCalculo <> 1 and Formula like '%{termoPesquisa}%'"; using (var command = new Microsoft.Data.SqlClient.SqlCommand(sqlUpdate, connection, transaction)) { try { command.ExecuteNonQuery(); transaction.Commit(); } catch (Exception exc) { excSql = exc; transaction.Rollback(); } } connection.Close(); if (excSql != null) { throw excSql; } } if (oldValue.Corporativo && !newValue.Corporativo) { var lista = projetoEstruturaOrganizacionalRepository.Filter(item => item.Tipo == TipoProjetoEstruturaOrganizacional.Corporativo && item.IdIndicador == newValue.Id); var listaIds = new List <long>(); lista?.ToList()?.ForEach(item => listaIds.Add(item.Id)); projetoEstruturaOrganizacionalRepository.DeleteMany(listaIds); } }
public void AvancarNivel(long id, long idSuperior) { CorrigirOrdens(idSuperior); var itens = Filter(item => item.IdSuperior == idSuperior).OrderBy(it => it.Ordem).ToList(); if (itens.Last().Id == id) { throw new Exception("Item não pode avançar."); } short ordem = itens.First(it => it.Id == id).Ordem; long idAfterElement = itens.First(it => it.Ordem == ordem + 1).Id; Exception excSql = null; using var connection = new Microsoft.Data.SqlClient.SqlConnection(databaseContext.Database.GetDbConnection().ConnectionString); connection.Open(); var transaction = connection.BeginTransaction(); string sql = $"update ProjetoEstruturaOrganizacional set Ordem = {ordem + 1} where Id = {id}; update ProjetoEstruturaOrganizacional set Ordem = {ordem} where Id = {idAfterElement};"; using (var command = new Microsoft.Data.SqlClient.SqlCommand(sql, connection, transaction)) { try { command.ExecuteNonQuery(); transaction.Commit(); } catch (Exception exc) { excSql = exc; transaction.Rollback(); } } connection.Close(); if (excSql != null) { throw excSql; } }
public async Task <IActionResult> registerStudent(StdEnr input) { SqlConnection conn = new SqlConnection(_connectionString); SqlCommand com = new SqlCommand(); Study study; { com.Connection = conn; com.CommandText = "select IdStudy, Name from Studies where Name = @name"; com.Parameters.AddWithValue("name", input.Studies); conn.Open(); try { SqlDataReader dataReader = await com.ExecuteReaderAsync(); await dataReader.ReadAsync(); study = new Study { IdStudy = int.Parse(dataReader["IdStudy"].ToString()), Name = dataReader["Name"].ToString() }; if (study == null) { return(BadRequest()); } } catch { return(null); } } conn = new SqlConnection(_connectionString); com = new SqlCommand(); conn.Open(); SqlTransaction transaction = conn.BeginTransaction(); com.Connection = conn; com.Transaction = transaction; com.CommandText = @"declare @enrollmentId int select @enrollmentId = e.IdEnrollment from Enrollment e left join Studies s on e.IdStudy = s.IdStudy where e.IdStudy = @studyId and e.Semester = 1 if @enrollmentId is null begin select @enrollmentId = max(IdEnrollment) + 1 from Enrollment insert into Enrollment values (@enrollmentId, 1, @studyId, getdate()); end insert into Student values (@index, @firstName, @lastName, @birthDate, @enrollmentId)"; com.Parameters.AddWithValue("studyId", study.IdStudy); com.Parameters.AddWithValue("index", input.IndexNumber); com.Parameters.AddWithValue("firstName", input.FirstName); com.Parameters.AddWithValue("lastName", input.LastName); com.Parameters.AddWithValue("birthDate", input.BirthDate); try { await com.ExecuteNonQueryAsync(); await transaction.CommitAsync(); } catch (Exception e) { await transaction.RollbackAsync(); } return(StatusCode(200)); }
public ImpotacaoLancamentosDto GerarLancamentos(IEnumerable <ImpotacaoLancamentos> lancamentos) { var builderErros = new System.Text.StringBuilder(); var builderStatus = new System.Text.StringBuilder(); var comandos = new List <Tuple <string, decimal, decimal, long?> >(); int numeroLinha = 0; foreach (var item in lancamentos) { numeroLinha++; var erros = new System.Text.StringBuilder(); var projeto = databaseContext.Projeto.FirstOrDefault(it => it.Id == item.IdProjeto); if (projeto is null) { erros.Append(" O ID de projeto não existe. "); } var dataAtual = DateTime.UtcNow.Date; if (!projeto.Ativo || projeto.DataInicio.Date > dataAtual || projeto.DataTermino < dataAtual) { erros.Append(" O projeto deve estar ativo e dentro da vigência atual. "); } var indicador = databaseContext.Indicador.FirstOrDefault(it => it.Identificador == item.Identificador); if (indicador is null) { erros.Append(" O identificador não existe. "); } if (erros.Length > 1) { builderErros.AppendLine($"A linha {numeroLinha} está com problema(s): '{erros.ToString()}'."); } else if (builderErros.Length == 0) { var lancamento = databaseContext.IndicadorLancamentos.FirstOrDefault(it => it.IdProjeto == item.IdProjeto && it.IdIndicador == indicador.Id && it.Ano == item.Ano && it.Mes == item.Mes); decimal valorMeta = 0.00m; decimal valorRealizado = 0.00m; string status = "Valor da meta e valor do realizado foram zerados porque o tipo de cálculo do indicador está definido como 'Meta e realizado calculados'."; if (indicador.TipoCalculo == TipoCalculo.NaoCalculado) { valorMeta = item.ValorMeta; valorRealizado = item.ValorRealizado; status = string.Empty; } else if (indicador.TipoCalculo == TipoCalculo.SomenteMeta) { valorRealizado = item.ValorRealizado; status = "Valor da meta foi zerado porque o tipo de cálculo do indicador está definido como 'Meta calculada'."; } else if (indicador.TipoCalculo == TipoCalculo.SomenteRealizado) { valorMeta = item.ValorMeta; status = "Valor do realizado foi zerado porque o tipo de cálculo do indicador está definido como 'Realizado calculado'."; } if (lancamento is null) { comandos.Add(new Tuple <string, decimal, decimal, long?>($"insert into IndicadorLancamento (IdProjeto, IdIndicador, Ano, Mes, ValorMeta, ValorRealizado) values ({item.IdProjeto}, {indicador.Id}, {item.Ano}, {item.Mes}, @p1, @p2);", valorMeta, valorRealizado, null)); builderStatus.Append($"<p style='color:green'>A linha {numeroLinha} foi <b>inserida</b> com sucesso. (<i style='color:orange'>{status}</i>)</p><br/>").Replace("(<i style='color:orange'></i>)", string.Empty); } else { comandos.Add(new Tuple <string, decimal, decimal, long?>("update IndicadorLancamento set ValorMeta = @p1, ValorRealizado = @p2 where Id = @p3;", valorMeta, valorRealizado, lancamento.Id)); builderStatus.Append($"<p style='color:blue'>A linha {numeroLinha} foi <b>atualizada</b> com sucesso. (<i style='color:orange'>{status}</i>)</p><br/>").Replace("(<i style='color:orange'></i>)", string.Empty); } } } if (builderErros.Length > 1) { return(new ImpotacaoLancamentosDto { Sucesso = false, Mensagem = builderErros.ToString().Replace(Environment.NewLine, "<br/>") }); } string erro = null; using var context = new Microsoft.Data.SqlClient.SqlConnection(databaseContext.Database.GetDbConnection().ConnectionString); context.Open(); using var transaction = context.BeginTransaction(); foreach (var item in comandos) { using var cmd = new Microsoft.Data.SqlClient.SqlCommand(item.Item1, context, transaction); try { cmd.Parameters.AddWithValue("p1", item.Item2); cmd.Parameters.AddWithValue("p2", item.Item3); if (item.Item4.HasValue) { cmd.Parameters.AddWithValue("p3", item.Item4.Value); } cmd.ExecuteNonQuery(); } catch (Exception exc) { erro = exc.Message; break; } } try { if (erro is null) { transaction.Commit(); } else { transaction.Rollback(); } context.Close(); } catch { } if (erro != null) { return(new ImpotacaoLancamentosDto { Sucesso = false, Mensagem = erro }); } return(new ImpotacaoLancamentosDto { Sucesso = true, Mensagem = builderStatus.ToString() }); }