none
Commit FB 2.5 em C# RRS feed

  • Pergunta

  • Bom dia,

    Estou desenvolvendo um sisteminha interno, no qual de acordo com a data de validade do produto coloco ele em promoção, no caso o update deverá colocar o período da promoção (exemplo do 01/01/2020 a 31/01/2020), o update funciona normalmente, se eu executo o select neste item ele aparece certo, mais só aparece no ERP quando é executado o COMMIT, quando coloco o breakpoint para ver o que está acontecendo ele passa pelo try sem erros executa o comando sem erro, e vai pro Finally, porém o commit não vai par ao ERP.
    Segue meu bloco de código.

     public void AtualizarProdutosMonitoramento(string dataini, string datafinal)
            {
                FbTransaction tran = null;
                try
                {
                    tran = AbrirConexao().BeginTransaction("teste");
                    FbCommand comando = new FbCommand("UPDATE PRODUTO SET PRODUTO.C_MONITDT_INICIAL = '" + dataini + "', PRODUTO.C_MONITDT_FINAL = '" + datafinal + "'\n" +
                              "WHERE PRODUTO.GRUPO3 IN (12,13,14) AND PRODUTO.TIPOPRODUTO = 0", tran);
                    tran.Save("Save1");
                    comando.ExecuteNonQuery();
                    tran.Commit();
                }
                catch (Exception e)
                {
                    tran.Rollback();
                    throw new Exception("Erro ao Atualizar Produtos monitoramento: " + e.Message);
                }
                finally
                {
                    FecharConexaoOnclick();
                }
            }

    quarta-feira, 8 de janeiro de 2020 12:59

Todas as Respostas

  • Boa tarde Lucas, sua pergunta ficou um pouco confusa.

    Esclareça melhor:

    o update funciona normalmente,

    se eu executo o select neste item ele aparece certo,

    mais só aparece no ERP quando é executado o COMMIT,

    quando coloco o breakpoint para ver o que está acontecendo ele passa pelo try sem erros executa o comando

    sem erro,e vai pro Finally,

    porém o commit não vai par ao ERP

    Ate onde entendi, se você executar o SQL de update e verificar no banco de dados, a informação aparece correta. Porem se verificar no sistema de ERP a informação esta errada, isso?

    Ou, ele executa o comando de Update sem erros, porem não atualiza a informação no banco de dados e consequentemente no ERP?

    todos os casos, tente algo do tipo (apenas um chute):

    public void AtualizarProdutosMonitoramento(string dataini, string datafinal)
            {
                FbTransaction tran = null;
                try
                {
                    tran = AbrirConexao().BeginTransaction("teste");
                    FbCommand comando = new FbCommand("UPDATE PRODUTO SET PRODUTO.C_MONITDT_INICIAL = '" + dataini + "', PRODUTO.C_MONITDT_FINAL = '" + datafinal + "'\n" +
                              "WHERE PRODUTO.GRUPO3 IN (12,13,14) AND PRODUTO.TIPOPRODUTO = 0; commit work;", tran);
                    tran.Save("Save1");
                    comando.ExecuteNonQuery();
                    tran.Commit();
                }
                catch (Exception e)
                {
                    tran.Rollback();
                    throw new Exception("Erro ao Atualizar Produtos monitoramento: " + e.Message);
                }
                finally
                {
                    FecharConexaoOnclick();
                }
            }



    • Sugerido como Resposta Williamfd sexta-feira, 10 de janeiro de 2020 14:30
    quarta-feira, 8 de janeiro de 2020 17:13
  • Boa tarde,

    Essa primeira parte eu consegui resolver, deixando de chamar função de abrir a conexão junto a variável de "tran", chamando ela no Fbcommand logo após o comando e antes da "tran". ficando assim:

    FbCommand comando = new FbCommand("UPDATE PRODUTO SET PRODUTO.C_MONITDT_INICIAL = '" + dataini + "', PRODUTO.C_MONITDT_FINAL = '" + datafinal + "'\n" +
                              "WHERE PRODUTO.GRUPO3 IN (12,13,14) AND PRODUTO.TIPOPRODUTO = 0; commit work;",AbrirConexao(), tran);

    Porém estou com outro problema!

    Após esse update eu devo executar uma Procedure, o C# executa ela normalmente, porém tanto no meu sistema quanto no ERP esses campos não são atualizados, agora se eu pegar e executar essa Procedure pelo IBExpert e depois COMMIT dela, atualiza tanto no meu sistema quanto no ERP. Segue meu bloco de código:

    public void AtualizaVendaRefMon(string dataMonInicial, string dataMonFinal)
            {
                try
                {
                    string comando;
                    dataMonInicial = dataMonInicial.Replace("/", ".");
                    dataMonFinal = dataMonFinal.Replace("/", ".");
    
                    comando = "execute procedure ATUALIZA_VENDA_REF_MON '" + dataMonInicial + "', '" + dataMonFinal + "'";
    
                    FbCommand com = new FbCommand(comando, AbrirConexaoOnclick());
                    com.ExecuteNonQuery();
                }
                catch(Exception e)
                {
                    throw new Exception("Erro ao iniciar monitoramento: " + e.Message);
                }
                finally
                {
                    FecharConexaoOnclick();
                }
            }

    Não sei o que fazer, tentei utilizar COMMIT igual utilizei na primeira parte, porém da erro Transação, como se não tivesse transação (isso dentro do C#).
    No IBExpert passando exatamente os mesmos parâmetros (no caso datainicial e datafinal) ele executa e ao fazer o COMMIT da certo, atualiza tanto no BD, C# e ERP.


    • Editado Lucas Lott quarta-feira, 8 de janeiro de 2020 21:28
    quarta-feira, 8 de janeiro de 2020 20:59
  • bom não uso firebird com c# então me baseando em outros métodos, tente da seguinte forma:

    public void AtualizaVendaRefMon(string dataMonInicial, string dataMonFinal)
            {
                try
                {
                    string comando;
                    dataMonInicial = dataMonInicial.Replace("/", ".");
                    dataMonFinal = dataMonFinal.Replace("/", ".");
    
                    comando = "execute procedure ATUALIZA_VENDA_REF_MON '" + dataMonInicial + "', '" + dataMonFinal + "'";
    		commando.Parameters.Add("@dataMonInicial", FbDbType.DateTime) 
    		commando.Parameters.Add("@dataMonFinal", FbDbType.DateTime) 
    
                    FbCommand com = new FbCommand(comando, AbrirConexaoOnclick());
                    com.ExecuteNonQuery();
                }
                catch(Exception e)
                {
                    throw new Exception("Erro ao iniciar monitoramento: " + e.Message);
                }
                finally
                {
                    FecharConexaoOnclick();
                }
            }

    • Sugerido como Resposta Williamfd sexta-feira, 10 de janeiro de 2020 14:30
    quinta-feira, 9 de janeiro de 2020 10:52
  • Bom dia,

    Testei aqui e funcionou perfeitamente!
    Muito obrigado!

    quinta-feira, 9 de janeiro de 2020 12:43
  • Lucas, bom dia! 

    Sempre prefira utilizar a inclusão de parâmetros para tratar qualquer valor que venha do frontend ou entrada de dados do usuário utilizando a tipagem de dados que é uma característica forte do c# na execução de qualquer procedimento no banco de dados (seja qual for). Em estudos de segurança você percebe que não faze-lo pode trazer grandes dores de cabeça. Na situação que você abordou, em uma especulação maliciosa, é possível finalizar o script incluir outro (que pode ser por exemplo a inclusão de um usuário e senha no seu banco de dados com acesso a todas as tabelas e permissão de acesso total) apenas como valor para a variável dataMonInicial e gerar uma falha na segurança da aplicação. Por isso a linha de comando commando.Parameters.Add("@dataMonInicial", FbDbType.DateTime) é muito importante, pois obriga a execução da sua aplicação a sempre tratar os textos trazidos da entrada de dados como dados do tipo primitivo e não comandos.

    As vezes os desenvolvedores estão pressionados por usuários ou gestores do projeto e evitam práticas como essa que podem evitar grandes problemas.

    Obs: Se a entrada de dados é uma informação que representa uma data então no back end da sua aplicação  force a conversão para data, se é número force a conversão para número, se é texto force para texto ex: Convert.ToDateTime e dê mensagens ao usuário sobre a situação de exceção.

    sábado, 11 de janeiro de 2020 13:11