Access Violation - Verificação de Login

09/11/2020

0

Estou tentando verificar o login, consigo capturar os valores dos Edits, passar para a query porém na hora de executar a query, recebo erro de Access Violation.
procedure TFrmLogin.SBTNEntrarClick(Sender: TObject);
begin
  try
    FuncionarioDAO := TFuncionarioDAO.Create;

    if (Functions.VerificaNull(EdtUsuario.Text) = true) or
      (Functions.VerificaNull(EdtSenha.Text) = true) then
      abort;

    if FuncionarioDAO.VerificarLogin(EdtUsuario.Text, EdtSenha.Text) = true then
    begin
      Application.MessageBox('Logado com sucesso!', 'Êxito!',
        MB_ICONINFORMATION);
      EdtUsuario.Clear;
      EdtSenha.Clear;
      // FrmLogin.Visible := False;
    end
    else
      Application.MessageBox('Verifique o Usuário e Senha e tente novamente!',
        'Login Inválido!', MB_ICONERROR);


Função verificarLogin
function TFuncionarioDAO.VerificarLogin(User, Passw: String): Boolean;
var
  vSQL: String;
begin
  vSQL := 'SELECT F.CPF, U.Senha FROM Funcionario F JOIN Usuario U on U.id_Usuario = F.id_Funcionario AND U.Senha = '
    + QuotedStr(Passw) + ' WHERE F.CPF = ' + QuotedStr(User);

  Result := HaRegistro(vSQL) > 0;
end;


Função que consulta registro no banco
function TConexaoDAO.HaRegistro(pSQL: String): Integer;
begin
  try
    uConnection.sqlConn.StartTransaction;
    FQuery.SQL.Text := pSQL;
    FQuery.Open;
    Result := FQuery.RowsAffected;
    uConnection.sqlConn.Commit;
  except
    uConnection.sqlConn.Rollback;
  end;
end;
Gabriel Vezoli

Gabriel Vezoli

Responder

Post mais votado

09/11/2020

se a condição é um booleano, basta "if condicao" (não é necessário "if condicao = true").
procedure TFrmLogin.SBTNEntrarClick(Sender: TObject);
begin
  try
    FuncionarioDAO := TFuncionarioDAO.Create;
 
    if Functions.VerificaNull(EdtUsuario.Text) or
      Functions.VerificaNull(EdtSenha.Text) then
      abort;

    if FuncionarioDAO.VerificarLogin(EdtUsuario.Text, EdtSenha.Text) then
    begin
      Application.MessageBox('Logado com sucesso!', 'Êxito!',
        MB_ICONINFORMATION);
      EdtUsuario.Clear;
      EdtSenha.Clear;
      // FrmLogin.Visible := False;
    end
    else
      Application.MessageBox('Verifique o Usuário e Senha e tente novamente!',
        'Login Inválido!', MB_ICONERROR);

em qual linha ocorre a exceção?
se você debuggar, chega a entrar na função HaRegistro() ?

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

09/11/2020

Gabriel Vezoli

se a condição é um booleano, basta "if condicao" (não é necessário "if condicao = true").
procedure TFrmLogin.SBTNEntrarClick(Sender: TObject);
begin
  try
    FuncionarioDAO := TFuncionarioDAO.Create;
 
    if Functions.VerificaNull(EdtUsuario.Text) or
      Functions.VerificaNull(EdtSenha.Text) then
      abort;

    if FuncionarioDAO.VerificarLogin(EdtUsuario.Text, EdtSenha.Text) then
    begin
      Application.MessageBox('Logado com sucesso!', 'Êxito!',
        MB_ICONINFORMATION);
      EdtUsuario.Clear;
      EdtSenha.Clear;
      // FrmLogin.Visible := False;
    end
    else
      Application.MessageBox('Verifique o Usuário e Senha e tente novamente!',
        'Login Inválido!', MB_ICONERROR);

em qual linha ocorre a exceção?
se você debuggar, chega a entrar na função HaRegistro() ?


Sim, ele entra na função, porém, quando vou executar a query, ele da o Access Violation
Responder

09/11/2020

Gabriel Vezoli

se a condição é um booleano, basta "if condicao" (não é necessário "if condicao = true").
procedure TFrmLogin.SBTNEntrarClick(Sender: TObject);
begin
  try
    FuncionarioDAO := TFuncionarioDAO.Create;
 
    if Functions.VerificaNull(EdtUsuario.Text) or
      Functions.VerificaNull(EdtSenha.Text) then
      abort;

    if FuncionarioDAO.VerificarLogin(EdtUsuario.Text, EdtSenha.Text) then
    begin
      Application.MessageBox('Logado com sucesso!', 'Êxito!',
        MB_ICONINFORMATION);
      EdtUsuario.Clear;
      EdtSenha.Clear;
      // FrmLogin.Visible := False;
    end
    else
      Application.MessageBox('Verifique o Usuário e Senha e tente novamente!',
        'Login Inválido!', MB_ICONERROR);

em qual linha ocorre a exceção?
se você debuggar, chega a entrar na função HaRegistro() ?


Sim, ele entra na função, porém, quando vou executar a query, ele da o Access Violation


O erro ocorre na seguinte linha:
function TConexaoDAO.HaRegistro(pSQL: String): Integer;
begin
  try
    uConnection.sqlConn.StartTransaction;
    ---> FQuery.SQL.Text := pSQL;
    FQuery.Open;
    Result := FQuery.RowsAffected;
    uConnection.sqlConn.Commit;
  except
    uConnection.sqlConn.Rollback;
  end;
end;
Responder

09/11/2020

Emerson Nascimento

onde foi declarado o objeto FQuery?
você está usando, mas onde ele foi criado?
function TConexaoDAO.HaRegistro(pSQL: String): Integer;
begin
  try
    // onde FQuery foi declarada/criada?
    if FQuery.Active then FQuery.Close; // se FQuery estiver aberta, fecha.
    FQuery.SQL.Text := pSQL; // atribui a instrução solicitada
//    uConnection.sqlConn.StartTransaction; // instruções SELECT não necessitam de transação
    FQuery.Open; // traz os registros solicitados ---> se é Open, sempre será uma SELECT
    Result := FQuery.RowsAffected; // não sei se há garantias no uso de RowsAffected. eu dou preferência ao COUNT() na instrução
    FQuery.Close; // não precisa mais do resultset, então fecha. 
//    uConnection.sqlConn.Commit; // desnecessário
  except
//    uConnection.sqlConn.Rollback; // desnecessário
  end;
end;



Responder

09/11/2020

Gabriel Vezoli

onde foi declarado o objeto FQuery?
você está usando, mas onde ele foi criado?
function TConexaoDAO.HaRegistro(pSQL: String): Integer;
begin
  try
    // onde FQuery foi declarada/criada?
    if FQuery.Active then FQuery.Close; // se FQuery estiver aberta, fecha.
    FQuery.SQL.Text := pSQL; // atribui a instrução solicitada
//    uConnection.sqlConn.StartTransaction; // instruções SELECT não necessitam de transação
    FQuery.Open; // traz os registros solicitados ---> se é Open, sempre será uma SELECT
    Result := FQuery.RowsAffected; // não sei se há garantias no uso de RowsAffected. eu dou preferência ao COUNT() na instrução
    FQuery.Close; // não precisa mais do resultset, então fecha. 
//    uConnection.sqlConn.Commit; // desnecessário
  except
//    uConnection.sqlConn.Rollback; // desnecessário
  end;
end;





A FQuery é criada aqui:
constructor TConexaoDAO.Create;
begin
  inherited Create;
  FQuery := TFDQuery.Create(nil);
  FQuery.Connection := uConnection.sqlConn;
end;
Responder

10/11/2020

Emerson Nascimento

talvez seja melhor isolar toda a necessidade da função na própria função:
function TConexaoDAO.HaRegistro(pSQL: String): Integer;
var
  FQueryReg: TFDQuery;
begin
  try
    FQueryReg := TFDQuery.Create(nil);
    FQueryReg.Connection := uConnection.sqlConn;
    FQueryReg.SQL.Text := pSQL; // atribui a instrução solicitada
    FQueryReg.Open; // traz os registros solicitados
    Result := FQueryReg.RowsAffected; // não sei se há garantias no uso de RowsAffected. eu dou preferência ao COUNT() na instrução
    FQueryReg.Close; // não precisa mais do resultset, então fecha. 
  finally
    FreeAndNil(FQueryReg)
  end;
end;


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar