Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Alfonso CV

Problema com Zeos e PostgreSQL em versão 2.00 de Lazarus

Recommended Posts

Alfonso CV

Olá galera.
Me esta a acontecer o seguinte.
Tenho uma app já desenvolvida e em "produção" desde a versão 1.6 de Lazarus, até lá todo bém. Resulta que a semana anterior fiz upgrade da versão 1.8 para a 2.00 de Lazarus e todo perfeito, mas a principio de semana quando os clientes começarem a explorar o sistema inicio-se a catástrofe.
Quando vou a gravar una transacção que inclui mais duna sentencia SQL o sistema compilado com a versão 2.00 me da um erro e antes não, isso sem cambiar uma linha de código.

Sublinho que isto não sucedia antes.
Fazendo um "debugger" (depurando o sistema) tomo las sentencias SQL para PostgreSQL que dá erro desde o sistema e a modo de exemplo:

UPDATE app.a_arbol SET cod='00096',descrip='MTCV' WHERE id=5200;
UPDATE app.a_pt SET longitud=-23.491440000000,latitud=14.919906000000,control_ip=0,circuito_comando=True,comentario='',
                                potencianominal=20.0,tipofornecimento=1,estado=True WHERE idarbol=5200;


as coloco no analisador de consultas do pgadmin de Postgres e correm perfeitamente mas se executo esta mesma sentencia desde o programa me da o error anterior.

E, o erro no sucede solo com estas sentencias, sino sempre que envio para PostgreSQL mas de una como por exemplo quando desejo eliminar registos de tabelas pais e filha, ou também quando desejo INSERTAR mais dum registo numa tabela e assim.....
Busque em outros forum mas a única coisa que vi é a sugestão para fazer transacções sentencia a sentencia mas se necessito por exemplo carregar uma tabela com 1000 registo resulta menos custoso em termos de tempo preparar uma query com todas as linhas e depois enviar que não ficar a enviar linha a linha. Assim fazia em versões anteriores a 2.00 de Lazarus sem dificuldades.

Alguem sabe si para la versión esta de Lazarus 2.00 y Zeos 7.2.4 existe algum parâmetro o propriedade nova que permita fazer/definir transacciones simples o complexas com múltiplas sentencia?.

Cumprimentos.

    Alfonso Arias Lemas

Share this post


Link to post
Share on other sites
M6

Sem mostrares qual é o erro não me parece que alguém te consiga ajudar. Se o problema não está no SQL deves depurar a aplicação, e talvez voltar para a versão anterior que estava estável até descobrires o que se passa.

Verifica se não tens de englobar isso tudo numa transação ou se tens alguma parametrização do componente que trata disso que tenhas de atualizar. Vê na documentação o que mudou entre a 1.8 e a 2.0.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Alfonso CV

Olá M6, no Link a seguir contem uma imagem do erro:

Link:https://drive.google.com/file/d/1vkcuQClKvArb9m3nmyf20rwLjVwIYe1A/view?usp=sharing

Mas

 

Share this post


Link to post
Share on other sites
Alfonso CV

M6, pressionei enviar antes de concluir a mensagem.

Mas é certo, imagino deva ser alguma coisa da configuração do componente ou, poderia ser um também um bug desta nova versão. Vou dar uma vista de olho na documentação a ver se encontro alguma coisa.

Cumprimentos,

 Alfonso.

Share this post


Link to post
Share on other sites
M6

Ok, assim já se percebe. Isso é uma característica do PostgreSQL "by design".

A solução que é capaz de ser a mais simples é converteres todas essas chamadas de lote em chamas simples, ou seja, desmultiplicares esses dois updates em duas chamas independentes.
Se isso não for uma opção por questões de performance (ou outras), tens de repensar trocar isso para funções/store procedures ou revisitares o desenho da coisa de forma mais profunda. Pelo que sei, há diferenças de comportamento entre as versões do PostgreSQL (em especial entre a 9.4 e a 9.5) que poderão estar na origem disso. Verifica se isto pode estar relacionado com o teu problema: https://www.postgresql.org/docs/9.5/sql-insert.html#SQL-ON-CONFLICT


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Alfonso CV

Bom dia.

Olha eu decidi simplificar cada sentencia destas SQL de uma a uma para avançar porque o sistema está em produção e não pode parar mas não fiquei convencido. A única mudança foi passar da versão 1.8 de Lazarus para a versão 2.0, o PostgreSQL continuo igual, a mesma versão 9.5.1.

Para mim seria ideal por exemplo: tenho um processo que importa com frequência como 1000 linhas num arquivo CSV e é introduzido numa tabela para ser processado e armazenado, antigamente eu fazia isso criando num String a sentencia SQL com todos os insert e depois enviava de uma vez todo junto e o processo erra rápido, agora tenho que enviar linha a linha e é lento pá caramba.

Cumprimentos,

     Alfonso Lemas

 

Share this post


Link to post
Share on other sites
M6

Para essa situação de popular uma tabela com informação de um CVS não vale a pena usar um insert into para cada linha.
Podes juntar várias linhas num só insert into:

insert into tabela (campo1, campo2) values (1, 'valor 1'), (2, 'valor2'), (3, 'valor 3');

Tens de ter em atenção o equilíbrio entre quaisquer limites (memória, rede, etc.) e teres uma string grande em memória e o seu envio pela rede.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Alfonso CV

Olá M6.

Optimo, esta opção me resolve completamente o problema, pois vai numa sentencia todo....

Muito obrigado.

Alfonso

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.