Access Violation - Verificação de Login
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.
Função verificarLogin
Função que consulta registro no banco
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
Curtidas 0
Melhor post
Emerson Nascimento
09/11/2020
se a condição é um booleano, basta "if condicao" (não é necessário "if condicao = true").
em qual linha ocorre a exceção?
se você debuggar, chega a entrar na função HaRegistro() ?
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() ?
GOSTEI 1
Mais Respostas
Gabriel Vezoli
09/11/2020
se a condição é um booleano, basta "if condicao" (não é necessário "if condicao = true").
em qual linha ocorre a exceção?
se você debuggar, chega a entrar na função HaRegistro() ?
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
GOSTEI 0
Gabriel Vezoli
09/11/2020
se a condição é um booleano, basta "if condicao" (não é necessário "if condicao = true").
em qual linha ocorre a exceção?
se você debuggar, chega a entrar na função HaRegistro() ?
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;GOSTEI 0
Emerson Nascimento
09/11/2020
onde foi declarado o objeto FQuery?
você está usando, mas onde ele foi criado?
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;GOSTEI 0
Gabriel Vezoli
09/11/2020
onde foi declarado o objeto FQuery?
você está usando, mas onde ele foi criado?
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;
GOSTEI 0
Emerson Nascimento
09/11/2020
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;GOSTEI 0