Access Violation Misterioso
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?
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
Curtidas 0
Respostas
Prgdelphi
08/10/2008
no lugar de SQL.add, tenta usar SQL.text := Descricao;
GOSTEI 0
Fajo
08/10/2008
Tentei, mesmo erro!! Incrível isso. Será q bug do Delphi?
GOSTEI 0
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.
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
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
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
08/10/2008
pra desencargo de consciência, qual é o conteúdo de [i:b55a707b7c]descricao[/i:b55a707b7c]?
GOSTEI 0
Fajo
08/10/2008
a função é chamada e o retorno associado a um label:
label1.caption := inttostr(ContaRegistros(´SELECT COUNT(ID) FROM TABELA´));
label1.caption := inttostr(ContaRegistros(´SELECT COUNT(ID) FROM TABELA´));
GOSTEI 0
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
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
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:
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
08/10/2008
Erro!!!
Mensagem Original:
Access violation at address 00404580 in module ´ Programa.exe´. Read of address FFFFFFDD.
Mensagem Original:
Access violation at address 00404580 in module ´ Programa.exe´. Read of address FFFFFFDD.
GOSTEI 0
Discorpio
08/10/2008
Boa tarde a todos.
O erro está na SQL.
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.
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
08/10/2008
O erro continua, mas, como já falei, vou partir pro D2009.
Obrigado
Obrigado
GOSTEI 0
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.
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
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_
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