Inquiridor
Commit FB 2.5 em C#

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