Login Either EOF and BOF...

19/05/2003

2

Amigos,


Estou com um probleminha... Estou tentando fazer uma tela de login... A consulta está ok! E o programa está compilando. Eu tenho registros salvos no banco, mas quando eu entro com o login e a senha ele processa, entra na condição de usuário inexistente e retorna aquele erro: raises Menssage ´Either EOF and BOF´... alguma coisa desse tipo... Esse erro tem dado também em outros forms deste mesmo programa quando eu utilizo o DBNavigator para ir visualizando os dados e deixo o ultimo registro selecionado...
Alguem sabe me dizer o que pode estar havendo e o que posso fazer?!


Responder

Posts

19/05/2003

Sousa_thiago

Qual BD vc está usando ?

EOF = End Off File

BOF = Begin Off File

Agora essa msg sua ai eu nunca vi ....


Responder

19/05/2003

Okama

Se possível insira aqui o código da busca do usuário, pode ter algo errado. Você está utilizando Table, Query, Filtro ??


Responder

19/05/2003

Rafaelunp

Se possível insira aqui o código da busca do usuário, pode ter algo errado. Você está utilizando Table, Query, Filtro ??


Amigos,

Estou usando SQL Server.

O erro que está dando é esse:

Project Sgc.exe raised exception class EOleException with message ´Either BOF or EOF is True, or the current record has deleted. Requested Operation requires a currente record´. Process stoped. Use Step or Run to continue.

Estou usando uma Query e um DataModule (para as tables e o DataSouce)...

o código do botão ok do login é esse:

procedure TFmLogin.B_Login_OkClick(Sender: TObject);
var
Sql2 : String;
begin
Sql2 := ´SELECT * FROM TB_Usuario ´
+´WHERE (S_Usuario_Login like ´´+ S_Login.Text +´´)´
+´AND (S_Usuario_Senha like ´´+ S_Senha.Text +´´)´;
with ADOQ_Login do
begin
//close;
sql.clear;
sql.add(Sql2);
open;
S_Login.clear;
S_Senha.clear;
If (ADOQ_Login.REcordCount > 0) Then // deixa passar pois o usuario e a senha estao certos
FmLogin.close
else // a senha ou o logim são invalidos..
ShowMessage(´Login ou Senha Inválido!´);
Close;
end;
end;

sempre está entrando no segundo else, ou seja, havendo registro ou não ele avisa que ´Login ou Senha Inválido´ e apresenta o erro!

Vejam ai o que posso estar errando...


Responder

20/05/2003

Okama

Verifique os códigos abaixo, inseri um Showmessage para você visualizar o que estava sendo consultado. Altere para o código a seguir:

[b:117ae2d52a]Sql2 := ´SELECT * FROM TB_Usuario ´ +´WHERE (S_Usuario_Login like ´´+ S_Login.Text +´´)´ +´AND (S_Usuario_Senha like ´´+ S_Senha.Text +´´)´; [/b:117ae2d52a]with ADOQ_Login do begin //close; sql.clear; sql.add(Sql2); [color=red:117ae2d52a] showmessage( sql.text );[/color:117ae2d52a] open; S_Login.clear; S_Senha.clear;




Sql2 := ´SELECT * FROM TB_Usuario ´+
         ´WHERE (S_Usuario_Login like ´ +#39+Trim(S_Login.Text) +39+´)´+
         ´AND (S_Usuario_Senha like ´+39+Trim( S_Senha.Text ) +39+ ´)´;
  



Responder

20/05/2003

Rafaelunp

Sql2 := ´SELECT * FROM TB_Usuario ´+
         ´WHERE (S_Usuario_Login like ´ +#39+Trim(S_Login.Text) +39+´)´+
         ´AND (S_Usuario_Senha like ´+39+Trim( S_Senha.Text ) +39+ ´)´;
  

Okama,

O código acima funcionou, em termos! A consulta está ok! Posso verificar pelo ShowMessage(Sql.Text); Porem, se o login for inválido, isto é, senha ou usuário não existente, o erro continua! O que poderá ser?
1º O que posso fazer para não aparecer esse erro??

2º Para que serve o 39?? O trim é para tirar acentos e espaços né??

Grato,


Responder

20/05/2003

Gatoledo

Rafael,

O #39 do amigo Okama serve para substituir as aspas duplas que vc está utilizando em seu código.

Quando utilizar o SQL Server com ADO não utilize aspas duplas (´) e sim asplas simples.

Veja um exemplo:

SQL := ´SELECT * FROM TB_Usuario ´+
´WHERE (S_Usuario_Login like ´´´ + Trim(S_Login.Text) +´´´)´;

Observe que após a cláusula like existem 3 aspas simples (´´´). Assim o Delphi entenderá que vc quer inserir uma aspas simples na sua cláusula.

Se houver outras cláusulas SQL relacionadas com o seu programa eu te aconselho que verifique-as novamente.

Atenciosamente,
Gabriel


Responder

21/05/2003

Rafaelunp

Amigos,

Como já disse a aplicação está rodando, mas se houver um usuário/senha inválido, ele retorna o seguinte erro:
´Project.exe raised exception class EOleException with message ´Either BOF or EOF is true, or the current record has been deleted. Requested operation requires a currente record´. Process Stopped. Use Step or Run to Continue.´
Já percebi que este erro ocorre em todos os forms que utilizo caso eu percorra todos os registros, isto é chegue no ultimo e feche o form...

Imagino que este erro seja dos componentes que estou usando. Estou Usando a Table Usuário e o DataSource (da tabela Usuario) em um Datamodule e um ADOQUERY no form do login. Este ADOQuery se conecta com o Datamodule e com o DataSource_Usuario. porem em momento algum eu estou me conectando (ativando) a query. Estou abrindo o Datamodule e dentro do login conforme código abaixo.

Minha duvida: Estou usando componentes demais? Estes componentes estão certos nos lugares certos? O que pode estar havendo para estar dando esse erro, visto que só dá quando a consulta retorna vazia? Será que falta algum parametro para bloquear isso?


procedure TFmLogin.B_Login_OkClick(Sender: TObject);
var
Sql2 : String;
begin
Sql2 := ´SELECT * FROM TB_Usuario ´+
´WHERE (S_Usuario_Login like ´´´+Trim(S_Login.Text)+´´´)´+
´AND (S_Usuario_Senha like ´´´+Trim(S_Senha.Text)+´´´)´;
with ADOQ_Login do
begin
DataModule1.ADOT_Usuario.Active := True;
Sql.clear;
Sql.add(Sql2);
ADOQ_Login.Open;
S_Login.clear;
S_Senha.clear;
// ShowMessage(Sql.text);
If (ADOQ_Login.REcordCount > 0) Then
FmLogin.close
else
ShowMessage(´Login ou Senha Inválido!´);
ADOQ_Login.Close;
DataModule1.ADOT_Usuario.Active := False;
end;
end;

grato,


Responder

21/05/2003

Rafaelunp

Por favor, olhem o que eu postei por ultimo...


Responder

21/05/2003

Okama

Sugiro que altera o RecordCount Por IsEmpty e organize melhor o código retirando o ´With .. do´


procedure TFmLogin.B_Login_OkClick(Sender: TObject); 
var  Sql2 : String; 

begin 
Sql2 := ´SELECT * FROM TB_Usuario ´+ 
            ´WHERE (S_Usuario_Login like ´´´+Trim(S_Login.Text)+´´´)´+ 
            ´AND (S_Usuario_Senha like ´´´+Trim(S_Senha.Text)+´´´)´; 

DataModule1.ADOT_Usuario.Active := True; 
ADOQ_Login.Sql.clear; 
ADOQ_Login.Sql.add(Sql2); 
ADOQ_Login.Open; 

S_Login.clear; 
S_Senha.clear; 

// ShowMessage(Sql.text); 

If not ADOQ_Login.IsEmpty Then 
//*************************\\

    FmLogin.close 
else 
    ShowMessage(´Login ou Senha Inválido!´); 

ADOQ_Login.Close; 

DataModule1.ADOT_Usuario.Active := False; 

end; 



Responder

22/05/2003

Pardal3000

Por um acaso vc está usando Delphi 5 e Windows XP??


Responder

22/05/2003

Sparch

Voce jah experimentou rodar a aplicacao fora do debug do delphi?
Acessando ele direto pelo executavel?
Dependendo da mensagem de erro, caso seja bem lógica nao ha o pq se preocupar tanto tendo em vista que ele está dando esse erro somente quando o usuario informa o login ou a senha que foram digitados erroneamente.

---
Daniel


Responder

22/05/2003

Rafaelunp

Voce jah experimentou rodar a aplicacao fora do debug do delphi? Acessando ele direto pelo executavel? Dependendo da mensagem de erro, caso seja bem lógica nao ha o pq se preocupar tanto tendo em vista que ele está dando esse erro somente quando o usuario informa o login ou a senha que foram digitados erroneamente. --- Daniel


Amigos,

Estou usando o Delphi 5 e Win2000.

Já testei pelo executavel sim, e o erro persiste. Alias, como eu já disse esse erro dá em qualquer form que eu chame e através do DbNavigator deixe o cursor no ultimo registro...
Imagino que seja algum componente que estou usando, pois como estou aprendendo a programar agora, devo estar esquecendo de algo.

Só pra relembrar, estou usando um datamodule com conexao ADO. Neste, para cada tabela tenho um ADO_Table e um DataSource, Todos as tables estao desativadas e estou fazendo a conexao no onShow e no OnClose assim:

DataModule1.ADOT_Usuario.Active := True;

Onde estou errando?


Responder

22/05/2003

Okama

Os DataSouces e Tables estão ´todos´ no DataModule?

Vá isolando o problema tente descobrir em qual linha do código ocorre o erro, remova alguns componente e insira-os novamente...


Responder

22/05/2003

Pardal3000

Prezado amigo,

O Delphi 5 possui um bug nas plataformas Windows XP/2000. O ADO apresenta esse erro mesmo. Fiquei várias semanas quebrando a cabeça também.

Baixe o Update Pack 1 no site da Borland, e uma atualização do ADO nos mesmo site. O Update Pack 1 será requerido para a atualização do segundo.

Pode fazer isso que irá resolver seu problema, com certeza!

Espero ter ajudado,

Pardal3000


Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar