Access Violation - Verificação de Login
09/11/2020
0
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
Post mais votado
09/11/2020
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
Mais Posts
09/11/2020
Gabriel Vezoli
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
09/11/2020
Gabriel Vezoli
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;
09/11/2020
Emerson Nascimento
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;
09/11/2020
Gabriel Vezoli
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;
10/11/2020
Emerson Nascimento
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;
Clique aqui para fazer login e interagir na Comunidade :)