Ir para conteúdo
  • Cadastre-se

dev botao

TSQLQuery trava no .execsql


Ver Solução Respondido por EMBarbosa,
  • Este tópico foi criado há 1625 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Estou com um problema muito estranho, eu envio um sql para o uma TSQLQuery, o insert está com erro, pois vai duplicar a chave primária da tabela, porém o erro não retorna, simplesmente trava a aplicação.

Segue trecho do código :

		try
			v_query := TSQLQuery.Create(nil);
			v_query.SQLConnection := l_Banco;
			v_provider := TDataSetProvider.Create(nil);
			v_provider.DataSet := v_query;
			v_client := TClientDataSet.Create(nil);
			v_client.SetProvider(v_provider);

			FormatSettings.DecimalSeparator := '.';
			FormatSettings.ThousandSeparator := ',';

			try
				v_desc.TransactionID := 1;
				v_desc.IsolationLevel := xilREADCOMMITTED;
				l_banco.StartTransaction(v_desc);
				try

					v_query.DisableControls;

					if v_query.Active then v_query.Close;
					if v_client.Active then v_client.Close;

					v_query.SQL.Clear;
					v_query.SQL.Add(l_sql);
					try
						v_query.ExecSQL; //// AQUI TRAVA A APLICAÇÃO QUANDO DÁ ERRO
					except on E:Exception do
						begin
							l_banco.Rollback(v_desc);
							Result := False;
							P_Message_Error(E.Message, l_sql, l_msg);
							l_msg_erro := E.Message+#13#10+#13#10+l_sql+#13#10+#13#10+'Origem : '+l_local_origem_erro;
							if g_envia_email_f_grava_suporte = 'S' then
							begin
								F_Envia_Email_Suporte(E.Message+#13#10+#13#10+l_sql+#13#10+#13#10+'Origem : '+l_local_origem_erro, 'Erro no F_Grava_Dbx');
							end;
						end;
					end;

					if v_query.RowsAffected > 0 then
						Result := True
					else Result := False;

					l_banco.Commit(v_desc);

				except on E:Exception do
					begin
						l_banco.Rollback(v_desc);
						Result := False;
						P_Message_Error(E.Message, l_sql, l_msg);
						l_msg_erro := E.Message+#13#10+#13#10+l_sql+#13#10+#13#10+'Origem : '+l_local_origem_erro;
						if g_envia_email_f_grava_suporte = 'S' then
						begin
							F_Envia_Email_Suporte(E.Message+#13#10+#13#10+l_sql+#13#10+#13#10+'Origem : '+l_local_origem_erro, 'Erro no F_Grava_Dbx');
						end;
					end;
				end;
			except on E:Exception do
				begin
					P_Message_Error(E.Message, l_sql, l_msg);
					l_msg_erro := E.Message+#13#10+#13#10+l_sql+#13#10+#13#10+'Origem : '+l_local_origem_erro;
					if g_envia_email_f_grava_suporte = 'S' then
					begin
						F_Envia_Email_Suporte('Erro Genérico no F_Grava_Dbx !'+#13#10+#13#10+
							E.Message+#13#10+#13#10+l_sql+#13#10+#13#10+'Origem : '+l_local_origem_erro, 'Erro no F_Grava_Dbx');
					end;
					Result := False;
				end;
			end;

			if Result and (g_usa_web = 'S') and l_gera_script then
			begin
				F_Insere_Script_Web(l_sql);
			end;

		finally

			FormatSettings.DecimalSeparator := g_decimal_separator;
			FormatSettings.ThousandSeparator := g_thousand_separator;

			v_client.Free;
			v_provider.Free;
			v_query.Free;

		end;

Alguém faz idéia do motivo ?

Muito Obrigado !

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

Link para o comentário
Compartilhar em outros sites

  • Consultores
  • Solution
19 horas atrás, Edevair Viesa Junior disse:

Estou com um problema muito estranho, eu envio um sql para o uma TSQLQuery, o insert está com erro, pois vai duplicar a chave primária da tabela, porém o erro não retorna, simplesmente trava a aplicação.

Não sei o banco de dados que você está usando, mas se o erro for ocasionado em outra transação pode ser porque essa conexão está configurada para "wait". Então até que a outra transação feche ou esgote o tempo limite, a aplicação vai ficar aguardando o BD. Nesse caso bastaria configurar para "no wait".

  • Curtir 2

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

4 horas atrás, EMBarbosa disse:

Não sei o banco de dados que você está usando, mas se o erro for ocasionado em outra transação pode ser porque essa conexão está configurada para "wait". Então até que a outra transação feche ou esgote o tempo limite, a aplicação vai ficar aguardando o BD. Nesse caso bastaria configurar para "no wait".

Obrigado por responder @EMBarbosa

Estou usando firebird, porém até pouco tempo isso não ocorria, como configuro este "no wait" ? E mais uma ainda, como configuro o time out da uma transaction ?

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

Link para o comentário
Compartilhar em outros sites

  • Consultores
1 minuto atrás, Edevair Viesa Junior disse:

Obrigado por responder @EMBarbosa

Estou usando firebird, porém até pouco tempo isso não ocorria, como configuro este "no wait" ? E mais uma ainda, como configuro o time out da uma transaction ?

É exatamente no Firebird que eu já vi isso acontecer. Você configura nos parâmetros da transação.

Não tenho como testar aqui, mas me parece que você vai configurar no TSQLConnection que você estiver usando. Ele tem uma propriedade Params que é TStrings...

No Object Inspector aparece o seguinte editor:

image.png

Aí onde está WaitOnLocks é onde precisa mudar de True para False.

22 minutos atrás, Edevair Viesa Junior disse:

porém até pouco tempo isso não ocorria

Isso pode significar que agora você está abrindo outras transações em concorrência que antes não eram abertas... Mas não tem como ter certeza sem toda a sua aplicação e um cenário para reproduzir.

  • Curtir 1
  • Obrigado 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

35 minutos atrás, EMBarbosa disse:

É exatamente no Firebird que eu já vi isso acontecer. Você configura nos parâmetros da transação.

Não tenho como testar aqui, mas me parece que você vai configurar no TSQLConnection que você estiver usando. Ele tem uma propriedade Params que é TStrings...

No Object Inspector aparece o seguinte editor:

image.png

Aí onde está WaitOnLocks é onde precisa mudar de True para False.

Isso pode significar que agora você está abrindo outras transações em concorrência que antes não eram abertas... Mas não tem como ter certeza sem toda a sua aplicação e um cenário para reproduzir.

Show, vivendo e aprendendo, vou testar e retorno. Muito Obrigado !

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

Link para o comentário
Compartilhar em outros sites

@EMBarbosa perfeito, era exatamento isso nos parâmetros de configuração eu uso um ini e estava assim :

Citar

[DC]
LIBRARYNAME=dbxfb.dll
GETDRIVERFUNC=getSQLDriverINTERBASE
VENDORLIB=fbclient.dll
DRIVERNAME=Firebird
CONNECTIONNAME=DATACENTER

[DATACENTER]
DriverName=Firebird
Database=C:\Bancos\Desenvolvimento\DataCenter\SGCL.FDB
RoleName=RoleName
User_Name=SYSDBA
Password=masterkey
ServerCharSet=WIN1252
SQLDialect=3
BlobSize=-1
CommitRetain=False
WaitOnLocks=True
ErrorResourceFile=
LocaleCode=0000
Interbase TransIsolation=ReadCommited
Trim Char=True

Bastou mudar o WaitOnLocks para False que apresentou o erro...

Muito obrigado !!!

Abs

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

Link para o comentário
Compartilhar em outros sites

  • Consultores
22 minutos atrás, Edevair Viesa Junior disse:

@EMBarbosa perfeito, era exatamento isso nos parâmetros de configuração eu uso um ini e estava assim :

Bastou mudar o WaitOnLocks para False que apresentou o erro...

Muito obrigado !!!

Abs

Que bom que resolveu. Obrigado pelo retorno.

  • Obrigado 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Em 25/10/2019 at 17:15, EMBarbosa disse:

Que bom que resolveu. Obrigado pelo retorno.

Boa tarde. Voltou a travar do nada novamente quando dá erro...

No caso é um erro de cave primária e trava quando tenta dar um insert, mesmo com o WaitOnLocks = True

Alguma outra idéia do que pode ser ?

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

Link para o comentário
Compartilhar em outros sites

  • Consultores
2 horas atrás, Edevair Viesa Junior disse:

No caso é um erro de cave primária e trava quando tenta dar um insert, mesmo com o WaitOnLocks = True

Alguma outra idéia do que pode ser ?

Se o WaitOnLock estiver True, vai travar mesmo...

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Em 31/10/2019 at 17:26, EMBarbosa disse:

Se o WaitOnLock estiver True, vai travar mesmo...

Desculpe escrevi errado, mesmo com o WaitOnLock = False;

E o mais engraçado é que tenho 13 clientes deste mesmo sistema e só em duas lojas acontece isso, nas outras funciona perfeitamente... E pendei que poderia ser alguma configuração do firebird, mas não é pq trago o banco para ambiente de desenvolvimento aqui na empresa e acontece a mesma coisa..

 

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

Link para o comentário
Compartilhar em outros sites

  • Consultores

 

Em 02/11/2019 at 11:33, Edevair Viesa Junior disse:

E o mais engraçado é que tenho 13 clientes deste mesmo sistema e só em duas lojas acontece isso, nas outras funciona perfeitamente... E pendei que poderia ser alguma configuração do firebird, mas não é pq trago o banco para ambiente de desenvolvimento aqui na empresa e acontece a mesma coisa..

Você tentou extrair o metadata e gerar um novo banco para excluir a possibilidade do banco estar corrompido?

  • Curtir 2

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Em 04/11/2019 at 13:33, EMBarbosa disse:

 

Você tentou extrair o metadata e gerar um novo banco para excluir a possibilidade do banco estar corrompido?

Tentei sim e o problema permanece...

Agora piorou um pouco mais, em um outro sistema,precisei de compilar o executável novamente e está travando toda vez que dá erro, estou achando que pode ser algo no Delphi !!!

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

Link para o comentário
Compartilhar em outros sites

  • Consultores
3 minutos atrás, Edevair Viesa Junior disse:

Tentei sim e o problema permanece...

Agora piorou um pouco mais, em um outro sistema,precisei de compilar o executável novamente e está travando toda vez que dá erro, estou achando que pode ser algo no Delphi !!!

O jeito vai ser você tentar criar um sistema mais simples. Quer dizer, pegue seu sistema e vai removendo o código até ficar o mínimo possível pra reproduzir o erro.

Isolando o erro vai ficar mais fácil de saber o motivo.

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

1 hora atrás, EMBarbosa disse:

O jeito vai ser você tentar criar um sistema mais simples. Quer dizer, pegue seu sistema e vai removendo o código até ficar o mínimo possível pra reproduzir o erro.

Isolando o erro vai ficar mais fácil de saber o motivo.

Debugando vcl eu consegui encontrar o problema...

Estava no uso de tecnologia obsoleto ao criar a transaction com o bd

Estava assim :

var v_transaction : TTransactionDesc;

	Result := False;
	if F_Banco_Dbx_Conectado(l_banco, l_sql, '') then
	begin
		Result := True;
		v_transaction.TransactionID := 1;
		v_transaction.IsolationLevel := xilREADCOMMITTED;
		l_banco.StartTransaction(v_transaction);
		try
			l_banco.ExecuteDirect(l_sql);
			l_banco.Commit(v_transaction);
		except on E:Exception do
			begin
				l_banco.Rollback(v_transaction);
				Result := False;
				P_Message_Error(E.Message, l_sql, l_msg);
			end;
		end;
	end;

Agora troquei por :

		var v_transaction : TDBXTransaction;
	
		Result := False;
		if F_Banco_Dbx_Conectado(l_banco, l_sql, '') then
		begin
			Result := False;
			v_transaction := l_banco.BeginTransaction(TDBXIsolations.ReadCommitted);
			try
				l_banco.ExecuteDirect(l_sql);
				l_banco.CommitFreeAndNil(v_transaction);
			except on E:Exception do
				begin
					l_banco.RollbackFreeAndNil(v_transaction);
					Result := False;
					P_Message_Error(E.Message, l_sql, l_msg);
				end;
			end;
		end;

Agora está tinindo, nenhum travamento....

Agradeço muito a ajuda...

  • Curtir 1

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

Link para o comentário
Compartilhar em outros sites

  • Consultores
2 minutos atrás, Edevair Viesa Junior disse:

Agora troquei por :

Ahhh entendi. É provável que no modo anterior não estava usando o "WaitOnLock = False" ao criar a nova transação.

Mas o mais importante é que resolveu. Obrigado pelo retorno.

bom trabalho por aí.

  • Curtir 1
  • Obrigado 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1625 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...