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:
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;
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.