Access Violation Misterioso

Delphi

08/10/2008

Oi Galera,

hj tive q abrir um sistema feito há dois anos para fazer algumas modificações, tudo estava funcionando perfeitamente até então, quando executei o projeto no D2007 apresentou o um erro de Access Violation na seguinte rotina:

function TDMPrincipal.ContaRegistros(Descricao: String): Integer;
var Qr: TSQLQuery;
begin
Qr := TSQLQuery.Create(nil);
with Qr do
try
SQLConnection := Conexao;
[b:3b272e2933] SQL.Add(Descricao);[/b:3b272e2933]
Open;
Result := Fields[0].Value;
finally
free;
end;
end;

e o pior, na linha negritada, faz algum sentido?


Fajo

Fajo

Curtidas 0

Respostas

Prgdelphi

Prgdelphi

08/10/2008

no lugar de SQL.add, tenta usar SQL.text := Descricao;


GOSTEI 0
Fajo

Fajo

08/10/2008

Tentei, mesmo erro!! Incrível isso. Será q bug do Delphi?


GOSTEI 0
Discorpio

Discorpio

08/10/2008

Bom dia a todos.

Olha eu testei aqui com o meu Delphi 2007, e a sua função funcionou corretamente.

Entretanto, possa ser que eu esteja enganado, porém na hora de destruir o componente TSQuery criado dinamicamente, voce está utilizando o método Free lá no final da instrução, isto porque voce esta utilizando ´Width´. Acontece que o Form onde está situado essa função possui o mesmo método, onde acredito que o sistema não esteja identificando qual componente deverá ser destruído (O TSQLQuery ou o Form).

Assim sendo, substitua ´Free´ por ´FreeAndNil(Qr)´ e testa ai se vai funcionar.


GOSTEI 0
Fajo

Fajo

08/10/2008

Oi Discorpio, blz

bom, fiz o q vc me pediu e continua a mesma mensagem, o pior é que possuo a mesma rotina em outros projetos e funciona normalmente, num sei pq q nesse tá dando esse erro;

Obrigado


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/10/2008

pra desencargo de consciência, qual é o conteúdo de [i:b55a707b7c]descricao[/i:b55a707b7c]?


GOSTEI 0
Fajo

Fajo

08/10/2008

a função é chamada e o retorno associado a um label:

label1.caption := inttostr(ContaRegistros(´SELECT COUNT(ID) FROM TABELA´));


GOSTEI 0
Fajo

Fajo

08/10/2008

Acabei nesse instante de instalar o Delphi 2009 e o projeto funcionou normalmente, acreditam? Incrível.

Só q já vi outro problema, quando inserimos um SqlConnection num form e damos um Clique Duplo se abre uma janela com as conexões existentes e opções para criarmos nova num é isso?! Pois, aqui no D2009 num acontece nada quando dou clique duplo no sqlconnection, alguém já tá usando o D2009?

Obrigado


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

08/10/2008

certo... então vamos fazer diferente... o erro deve estar acontecendo no retorno da função, no momento do inttostr().

vamos tentar descobrir qual é o erro:
function TDMPrincipal.ContaRegistros(Descricao: String): Integer;
var
  Qr: TSQLQuery;
begin
  Qr := TSQLQuery.Create(nil);
  with Qr do
    try
      SQLConnection := Conexao;
      SQL.Add(Descricao);
      Open;
      Result := Fields[0].AsString;
    except
      on E:Exception do
      begin
        ShowMessage(´Erro!!!´1313´Mensagem original: ´13+E.Message);
        Result := -1;
      end;
    end;

  Qr.Free; // ou FreeAndNil(Qr);
end;



GOSTEI 0
Fajo

Fajo

08/10/2008

Erro!!!

Mensagem Original:
Access violation at address 00404580 in module ´ Programa.exe´. Read of address FFFFFFDD.


GOSTEI 0
Discorpio

Discorpio

08/10/2008

Boa tarde a todos.

O erro está na SQL.

// Erro SELECT COUNT(ID) FROM TABELA // Certo SELECT COUNT(ID) [color=red:1bb755fc9a]AS TOTREG[/color:1bb755fc9a] FROM TABELA


Voce estava fazendo uma SQL de agrupamento, só que se esqueceu de renomear o campo e criá-lo virtualmente dentro da instrução como AS TOTREG, AS TOTAL, e ai o que era retornado da contagem estava se perdendo e a instrução Select não estava retornando nenhum campo. A consequência disto, o método Fields[0] estava nulo.


GOSTEI 0
Fajo

Fajo

08/10/2008

O erro continua, mas, como já falei, vou partir pro D2009.

Obrigado


GOSTEI 0
Discorpio

Discorpio

08/10/2008

Boa tarde Fajo.

Este erro pode ser um monte de suposições, então ai la vai algumas.

Voce verficou lá dentro do seu banco se o nome da tabela está correto :?: O nome campo também :?:

Já tentou usar a SQL ´Select Count(*) as TotReg From NomeTabela´ ao invés de ´Select Count(ID)......´

Já tentou instanciar o objeto TSQLQuery como o proprietário igual o Formulário assim: ´Qr := TSQLQuery.Create(Self);

Enfim, não sei o por que no seu Delphi 2007 não funciona, porque no meu aqui funcionou.


GOSTEI 0
Dgsfilho

Dgsfilho

08/10/2008

Comigo está acontecendo a mesma coisa, tinha um projeto no D2006 e quando abri no D2009 começou a dar esse mesmo erro de access violation at address 00409281 in module ´ Programa.exe´. Read of address FFFFFFDD. Estou dividindo os componentes Dataset em outros DMs, pois quando estou depurando o erro ocorre na criação do DMPrincipal. Caso funcione eu posto para informar o resultado. Estou usando o Firebird 2.0.1, antes usava o driver UIBfire15.dll para conexão, só que no D2009 não funciona, então vou tentar usar o do interbase.


GOSTEI 0
Pestana_

Pestana_

08/10/2008

Oi Galera, hj tive q abrir um sistema feito há dois anos para fazer algumas modificações, tudo estava funcionando perfeitamente até então, quando executei o projeto no D2007 apresentou o um erro de Access Violation na seguinte rotina: function TDMPrincipal.ContaRegistros(Descricao: String): Integer; var Qr: TSQLQuery; begin Qr := TSQLQuery.Create(nil); with Qr do try SQLConnection := Conexao; [b:a7c1164def] SQL.Add(Descricao);[/b:a7c1164def] Open; Result := Fields[0].Value; finally free; end; end; e o pior, na linha negritada, faz algum sentido?


o dataModule que contem esta query foi criado antes de você utilizar esta função, porque esta parecendo que você esta tentando acessar algum objeto que não foi criado (instanciado) na memoria.


GOSTEI 0
POSTAR