bom, o que aconteçe é que estou criando uma estrutura de login de usuários, criei a minha classe usuários todinha e fiz um botão no meu formulário principal com o seguinte código:
procedure TfrmPrincipal.Button1Click(Sender: TObject);
begin
if TUsuario.GetInstance.Login('ronaldo','123456',Acoes) then
showmessage('Logado com sucesso')
else
showmessage('não logado');
end;
o que aconteçe é que ao clicar neste botão ele me retorna um erro dizendo que a tabela USUARIOS é desconhecida (UNKNOW TABLE USUARIOS), porem já vi todo o código da classe usuário (que eu creio que o erro esteja lá, e não encontrei nada). aqui vai o código da minha classe usuário:
unit uUsuario;
interface
uses
ActnList, DBXCommon;
type TUsuario = class
private
FID: Integer;
FSenha: String;
FLogin: String;
FNome: String;
FPerfilID: Integer;
FLogado: Boolean;
FAcoes: TCustomActionList;
constructor CreatePrivate;
class var FInstance: TUsuario;
{ private declarations }
protected
{ protected declarations }
function LoadProfile: Boolean;virtual;
public
{ public declarations }
constructor Create;
function Login(AUsuario, Asenha: String; Acoes: TCustomActionList): Boolean;
function GetPerfilName: string;
function GetPerfilDescription: string;
function ChangePassword (strOldPassword,strNewPassword: string):Boolean;
class function GetInstance: TUsuario;
published
{ published declarations }
property ID: Integer read FID;
property Nome: String read FNome;
property Usuario: String read FLogin;
property Senha: String read FSenha;
property PerfilID: Integer read FPerfilID;
end;
implementation
uses
SysUtils, Dialogs, uDM;
{ TUsuario }
function TUsuario.ChangePassword(strOldPassword,
strNewPassword: string): Boolean;
var
DBCon: TDBXConnection;
Command: TDBXCommand;
T: TDBXTransaction;
begin
if FSenha = strOldPassword then
Begin
try
DBCon := TDBXConnectionFactory.GetConnectionFactory.GetConnection('FBConnection','SYSDBA','masterkey');
T:= DBCon.BeginTransaction;
Command:= DBCon.CreateCommand;
Command.Text := 'UPDATE SET senha = '+QuotedStr(strNewpassword)+
'WHERE usuariosid= '+IntToStr(FID);
Command.ExecuteUpdate;
DBCon.CommitFreeAndNil(T);
Result := True;
except
DBCon.RollbackFreeAndNil(T);
end;
End
else
MessageDlg('A Senha Antiga não confere !!',mtInformation,[mbOK],0);
end;
constructor TUsuario.Create;
begin
raise Exception.Create('Para obter uma instância de TUsuario utilize TUsuario.GetInstance');
end;
constructor TUsuario.CreatePrivate;
begin
inherited Create;
end;
class function TUsuario.GetInstance: TUsuario;
begin
if not Assigned(FInstance) then
FInstance := TUsuario.CreatePrivate;
Result := FInstance;
end;
function TUsuario.GetPerfilDescription: string;
var
DBCon: TDBXConnection;
Command: TDBXCommand;
Reader: TDBXReader;
begin
if FLogado then
Begin
DBCon := TDBXConnectionFactory.GetConnectionFactory.GetConnection('FBConnection','SYSDBA','masterkey');
Command:= DBCon.CreateCommand;
Command.Text := 'SELECT descricao FROM perfil WHERE perfilid = '+IntToStr(FPerfilID);
Reader := Command.ExecuteQuery;
if Reader.Next then
Result := Reader.Value[0].GetAnsiString;
end
else
MessageDlg('É necessário está logado para invocar este método !!',mtWarning,[mbOK],0);
end;
function TUsuario.GetPerfilName: string;
var
DBCon: TDBXConnection;
Command: TDBXCommand;
Reader: TDBXReader;
begin
if FLogado then
Begin
DBCon := TDBXConnectionFactory.GetConnectionFactory.GetConnection('FBConnection','SYSDBA','masterkey');
Command:= DBCon.CreateCommand;
Command.Text := 'SELECT nome FROM perfil WHERE perfilid = '+IntToStr(FPerfilID);
Reader := Command.ExecuteQuery;
if Reader.Next then
Result := Reader.Value[0].GetAnsiString;
end
else
MessageDlg('É necessário está logado para invocar este método !!',mtWarning,[mbOK],0);
end;
function TUsuario.LoadProfile: Boolean;
var
DBCon: TDBXConnection;
Command: TDBXCommand;
Reader: TDBXReader;
I: Integer;
Nm, Pr: String;
begin
DBCon := TDBXConnectionFactory.GetConnectionFactory.GetConnection('FBConnection','SYSDBA','masterkey');
Command:= DBCon.CreateCommand;
Command.Text := 'SELECT name, permissao FROM perfil_conf WHERE perfilid= '+IntToStr(FPerfilID);
Reader := Command.ExecuteQuery;
while Reader.Next do
Nm := Reader.Value[0].GetAnsiString;
Pr := Reader.Value[1].GetAnsiString;
begin
for I := 0 to Pred(FAcoes.ActionCount) do
begin
if TAction(FAcoes.Actions[I]).Name = Nm then
begin
TAction(FAcoes.Actions[I]).Enabled := 'V' = Pr;
break;
end;
end;
end;
Result := True;
end;
function TUsuario.Login(AUsuario, Asenha: String;
Acoes: TCustomActionList): Boolean;
var
DBCon: TDBXConnection;
Command: TDBXCommand;
Reader: TDBXReader;
begin
DBCon := TDBXConnectionFactory.GetConnectionFactory.GetConnection('FBConnection','SYSDBA','masterkey');
Command:= DBCon.CreateCommand;
Command.Text := 'SELECT * FROM usuarios WHERE login = '+QuotedStr(AUsuario)+
'and senha = '+QuotedStr(ASenha);
Reader := Command.ExecuteQuery;
if Reader.Next then
begin
FID := Reader.Value[0].GetInt32;
FperfilID := Reader.Value[1].GetInt32;
FNome := Reader.Value[2].GetAnsiString;
FLogin := Reader.Value[6].GetAnsiString;
FSenha := Reader.Value[7].GetAnsiString;
FLogado := True;
FAcoes := Acoes;
if LoadProfile then
Result:= True
else
MessageDlg('É necessário está logado para invocar este método !!',mtWarning,[mbOK],0);
end;
end;
end.
obs: outras coisas que percebi. no meu DataModule os comandos em sql estão todos assim >> select * from "tabela" << ou seja, o nome da tabela está sempre entre aspas duplas.
Na minha classe usuários o select ta normal >> select * from tabela where id = blablabla <<< , porém quando eu mudo para >> select * from "tabela" where "id" = blablaba << o erro para mais no final ele da outro erro dizendo que o Reader nãao tem mais rows (no more rows for reader ou algo do tipo).
obs2: no meu proprio ibexpert fiz o teste, se eu por >> select * from tabela where qualquercoisa = 'blabla' << ele não funciona mais se eu por select * from "tabela" where "qualquercoisa" = 'blabla' << ele pesquisa direitinho e me mostra os resultados;
Pergunta
Ronaldo Lanhellas
bom, o que aconteçe é que estou criando uma estrutura de login de usuários, criei a minha classe usuários todinha e fiz um botão no meu formulário principal com o seguinte código:
o que aconteçe é que ao clicar neste botão ele me retorna um erro dizendo que a tabela USUARIOS é desconhecida (UNKNOW TABLE USUARIOS), porem já vi todo o código da classe usuário (que eu creio que o erro esteja lá, e não encontrei nada). aqui vai o código da minha classe usuário:obs: outras coisas que percebi. no meu DataModule os comandos em sql estão todos assim >> select * from "tabela" << ou seja, o nome da tabela está sempre entre aspas duplas.
Na minha classe usuários o select ta normal >> select * from tabela where id = blablabla <<< , porém quando eu mudo para >> select * from "tabela" where "id" = blablaba << o erro para mais no final ele da outro erro dizendo que o Reader nãao tem mais rows (no more rows for reader ou algo do tipo).
obs2: no meu proprio ibexpert fiz o teste, se eu por >> select * from tabela where qualquercoisa = 'blabla' << ele não funciona mais se eu por select * from "tabela" where "qualquercoisa" = 'blabla' << ele pesquisa direitinho e me mostra os resultados;
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.