Parâmetros Firedac - Delphi
11/09/2021
0
Galera tenho uma aplicação onde os parâmetros do firedac é armazenado no arquivo .ini.
Sempre que tento executar a aplição em outro computador o fazendo de terminal, a aplicação só executada caso tenha o arquivo do banco de dados no diretório informado no arquivo .ini, como fazer para que o firedac pule essa etapa, pois é um terminal, não é necessario.
Código fonte:
procedure TFrmMatricula.FormCreate(Sender: TObject);
var
ArqIni : TIniFile;
Server, PortIndicator, User, directory, database : string;
begin
directory := (ExtractFilePath(ParamStr(0)) + '\Conf');
if not DirectoryExists(directory) then
begin
ForceDirectories(directory);
Server := (ExtractFilePath(ParamStr(0)) + 'conf\config.ini');
ArqIni := TIniFile.Create(Server);
ArqIni.WriteString('SERVER','HOST','25.13.43.171');
ArqIni.Free;
User := (ExtractFilePath(ParamStr(1)) + 'conf\config.ini');
ArqIni := TIniFile.Create(User);
ArqIni.WriteString('USER','USER','sysdba');
ArqIni.Free;
PortIndicator := (ExtractFilePath(ParamStr(2)) + 'conf\config.ini');
ArqIni := TIniFile.Create(PortIndicator);
ArqIni.WriteString('PORT','PORT','3051');
ArqIni.Free;
database := (ExtractFilePath(ParamStr(3)) + 'conf\config.ini');
ArqIni := TIniFile.Create(database);
ArqIni.WriteString('DATABASE','DIRECTORY','C:\Indicator\Data\BANCO.FDB');
ArqIni.Free;
end
else
begin
CaminhoIniDatabase := (extractfilepath(ParamStr(3)) + 'Conf\Config.ini');
ArqIni:= TIniFile.Create(CaminhoIniDatabase);
CaminhoIniDatabase := ArqIni.ReadString ('DATABASE','DIRECTORY','');
FdConeIndicador.Params.Database := CaminhoIniDatabase;
try
FdConeIndicador.Connected := true;
Timer1.Enabled := true;
Except
MessageBox(Handle,'Failed To Connect Database! Check Database Directory.','Bot Zeus', MB_OK + MB_ICONERROR);
FdConeIndicador.Connected := false;
Application.Terminate;
exit
end;
end;
end;
Arquivo .ini :
[SERVER]
HOST=25.13.43.171
[USER]
USER=sysdba
[PORT]
PORT=3051
[DATABASE]
DIRECTORY=C:\Indicator\Data\BANCO.FDB
Obs: A aplicação conecta com o banco de dados no servidor, mais o problema que a aplicação só abre caso tenha o diretório do banco.
Jefferson
Posts
15/09/2021
Emerson Nascimento
porque teu código poderia se resumir a:
procedure TFrmMatricula.FormCreate(Sender: TObject); var ArqIni : TIniFile; directory, nomeini: string; begin directory := ExtractFilePath(ParamStr(0)) + '\\Conf'; nomeini := directory + '\\config.ini'; if not DirectoryExists(directory) then begin ForceDirectories(directory); ArqIni := TIniFile.Create(NomeIni); ArqIni.WriteString('DATABASE','HOST','25.13.43.171'); ArqIni.WriteString('DATABASE','PORT','3051'); ArqIni.WriteString('DATABASE','DIRECTORY','C:\\Indicator\\Data\\BANCO.FDB'); ArqIni.WriteString('DATABASE','USER','sysdba'); ArqIni.WriteString('DATABASE','PASSWORD','xxxxxx'); // se gravar a senha, grave-a criptografada ArqIni.Free; end; ArqIni:= TIniFile.Create(NomeIni); FdConeIndicador.Params.Server := ArqIni.ReadString ('DATABASE','HOST',''); FdConeIndicador.Params.Port := ArqIni.ReadString ('DATABASE','PORT',''); FdConeIndicador.Params.Database := ArqIni.ReadString ('DATABASE','DIRECTORY',''); FdConeIndicador.Params.User_Name := ArqIni.ReadString ('DATABASE','USER',''); FdConeIndicador.Params.Password := ArqIni.ReadString ('DATABASE','PASSWORD',''); // se gravou criptografada, descriptografe try FdConeIndicador.Connected := true; Timer1.Enabled := true; Except MessageBox(Handle,'Failed To Connect Database! Check Database Directory.','Bot Zeus', MB_OK + MB_ICONERROR); Application.Terminate; end; end;
geralmente um arquivo ini agrupa os valores (chaves) referentes a um mesmo assunto (seção).
no teu caso os dados se referem a conexão ao banco de dados. deveriam ficar numa mesma seção:
[DATABASE] HOST=25.13.43.171 USER=sysdba PASSWORD=senha_criptografada PORT=3051 DIRECTORY=C:\\Indicator\\Data\\BANCO.FDB
agora uma pergunta: em que momento ocorre o erro? e qual o erro apresentado?
porque quando a conexão ao banco de dados é efetuada, o sistema acessa o servidor (no caso, 25.13.43.171) e procura ali o caminho do banco de dados, que precisa existir.
então é estranho que o erro ocorra no trecho de código apresentado.
----------------------------------------------------------------------------------------------------------------------
IMPORTANTE: antes de compilar teu projeto desconecte o FDConnection.
----------------------------------------------------------------------------------------------------------------------
16/09/2021
Jefferson
*Sim, toda a estruturaque eu informei acima do meu arquivo .ini ficar em um só arquivo.
*O meu FDConection fica desativado até que todas as informações do arquivo .ini recebidas sejam válidas, ai sim ele é ativado.
* O erro é apresentado quando a aplicão chega nessa parte do código:
begin
CaminhoIniDatabase := (extractfilepath(ParamStr(3)) + 'Conf\\Config.ini');
ArqIni:= TIniFile.Create(CaminhoIniDatabase);
CaminhoIniDatabase := ArqIni.ReadString ('DATABASE','DIRECTORY',' ');
FdConeIndicador.Params.Database := CaminhoIniDatabase;
try
FdConeIndicador.Connected := true;
Timer1.Enabled := true;
Except
MessageBox(Handle,'Failed To Connect Database! Check Database Directory.','Bot Zeus', MB_OK + MB_ICONERROR);
FdConeIndicador.Connected := false;
Application.Terminate;
exit
end;
end;
Pois se não conter o arquivo 'Banco.fdb' no dirétorio informado da aplicação ele não abre
*C:\\Indicator\\Data\\BANCO.FDB*. A questão é que é um terminal, creio que não seja necessário, não quero que o cliente final tenha informações suficientes para fazer alguma maldade, no entanto já até coloquei essas configuração no próprio FDConection, deixando-o somente o Host,User, Port se caso seja necessário fazer alguma mudança, dessa forma fica fácil alterar a configuração.
Trabalho com um sistema de automação comercial, e nos terminais não é necessário ter o arquivo do banco de dados, desde que nas configurações esteja apontada para o servidor, creio eu que o metódo de conexão com o banco de dados seja diferente, no caso outros componentes do delphi.
Reformulei meu código como você me informou acima, e ainda vou informar quando a aplicação dispara a conexão com o banco de dados.
Criação Formulário:
procedure TFrmMatricula.FormCreate(Sender: TObject);
var
ArqIni : TIniFile;
Server, PortIndicator, User, directory, database, Conf: string;
begin
directory := (ExtractFilePath(ParamStr(0)) + '\\Conf');
if not DirectoryExists(directory) then
begin
Conf := (directory + '\\config.ini');
ForceDirectories(directory);
ArqIni := TIniFile.Create(Conf);
ArqIni.WriteString('SERVER','HOST','25.13.43.171');
ArqIni.WriteString('USER','USER','sysdba');
ArqIni.WriteString('PORT','PORT','3051');
ArqIni.WriteString('DATABASE','DIRECTORY','C:\\Indicator\\Data\\BANCO.FDB');
ArqIni.Free;
end
else
begin
CaminhoIniDatabase := (extractfilepath(ParamStr(3)) + 'Conf\\Config.ini');
ArqIni:= TIniFile.Create(CaminhoIniDatabase);
CaminhoIniDatabase := ArqIni.ReadString ('DATABASE','DIRECTORY','');
FdConeIndicador.Params.Database := CaminhoIniDatabase;
try
FdConeIndicador.Connected := true;
Timer1.Enabled := true;
Except
MessageBox(Handle,'Failed To Connect Database! Check Database Directory.','Bot Zeus', MB_OK + MB_ICONERROR);
FdConeIndicador.Connected := false;
Application.Terminate;
exit
end;
end;
end;
*Verificação parâmetros da conexão ao efetuar o login:
procedure TFrmMatricula.BitBtnLoginClick(Sender: TObject);
var
ArqIni : TIniFile;
UserLogin, Name : string;
CaminhoIniServer, PortIndicator, User: string;
begin
CaminhoIniServer := (extractfilepath(ParamStr(0)) + 'Conf\\Config.ini');
ArqIni:= TIniFile.Create(CaminhoIniServer);
CaminhoIniServer := ArqIni.ReadString ('SERVER','HOST','');
FdConeIndicador.Params.Values['Server'] := CaminhoIniServer;
try
fdConeIndicador.Connected := true;
Timer1.Enabled := true;
Except
MessageBox(Handle,'Failed To Connect Database! Check The Firebird Server.','Bot Zeus', MB_OK + MB_ICONERROR);
FdConeIndicador.Connected := false;
Application.Terminate;
Exit
end;
begin
User := (extractfilepath(ParamStr(1)) + 'Conf\\Config.ini');
ArqIni:= TIniFile.Create(User);
User:= ArqIni.ReadString ('USER','USER','');
FdConeIndicador.Params.UserName := User;
try
FdConeIndicador.Connected := true;
Timer1.Enabled := true;
Except
MessageBox(Handle,'Failed to Connect Database! Check The Firebird User.','Bot Zeus', MB_OK + MB_ICONERROR);
FdConeIndicador.Connected := false;
Application.Terminate;
Exit
end;
begin
PortIndicator := (extractfilepath(ParamStr(2)) + 'Conf\\Config.ini');
ArqIni:= TIniFile.Create(PortIndicator);
PortIndicator := ArqIni.ReadString ('PORT','PORT','');
FdConeIndicador.Params.Values['Port'] := PortIndicator;
try
FdConeIndicador.Connected := true;
Timer1.Enabled := true;
Except
MessageBox(Handle,'Failed to Connect Database! Check The Firebird Port.','Bot Zeus', MB_OK + MB_ICONERROR);
FdConeIndicador.Connected := false;
Application.Terminate;
exit
end;
begin
UserLogin := Edit1.Text;
FDQryLogin.Active := true;
FDQryLogin.Close;
FDQryLogin.SQL.Clear;
FDQryLogin.SQL.Add('select usuario from cliente where usuario = ' + QuotedStr(UserLogin)+'');
FDQryLogin.Open;
if FDQryLogin.Eof then
begin
MessageBox(handle,'Login Failed! Please Check Informed Registration.','Bot Zeus', MB_OK or MB_ICONINFORMATION);
end
else
begin
FDQryUser.Active := true;
FDQryUser.Close;
FDQryUser.SQL.Clear;
FDQryUser.SQL.Add('select * from cliente');
FDQryUser.Open;
UserLogin := FDQryUser.FieldByName('USUARIO').AsString;
Name := FDQryUser.FieldByName('NOME').AsString;
if MessageBox(handle,(Pchar('Welcome User '+(UserLogin)+' - '+(Name)+' To Zeus Bot!')),'Zeus Bot', MB_OK + MB_ICONINFORMATION) = mrOk then
begin
FrmMatricula.Hide;
FrmIndicadorPainel.ShowModal;
end;
end;
end;
end;
end;
end;
Obs: Se existir o arquivo do banco de dados, a aplicação roda perfeitamente, mais sim acessando o banco de dados do servidor. Já alimentei o banco de dados com informações no servidor realizando testes, e tudo está conectado e funcionando nos conformes.
Atráves de pesquisas vi que deixar o parâmetros do FDConection(MonitorBy) como 'Remoto', resolveria o problema, mais sem sucesso.
16/09/2021
Emerson Nascimento
procedure TFrmMatricula.FormCreate(Sender: TObject); var ArqIni : TIniFile; directory, nomeini: string; begin directory := ExtractFilePath(ParamStr(0)) + '\\Conf'; nomeini := directory + '\\config.ini'; if not DirectoryExists(directory) then begin ForceDirectories(directory); ArqIni := TIniFile.Create(NomeIni); ArqIni.WriteString('DATABASE','HOST','25.13.43.171'); ArqIni.WriteString('DATABASE','PORT','3051'); ArqIni.WriteString('DATABASE','DIRECTORY','C:\\Indicator\\Data\\BANCO.FDB'); ArqIni.WriteString('DATABASE','USER','sysdba'); ArqIni.Free; end; ArqIni := TIniFile.Create(NomeIni); FdConeIndicador.Params.Values['Server'] := ArqIni.ReadString ('DATABASE','HOST',''); FdConeIndicador.Params.Values['Port'] := ArqIni.ReadString ('DATABASE','PORT',''); FdConeIndicador.Params.Values['Database'] := ArqIni.ReadString ('DATABASE','DIRECTORY',''); FdConeIndicador.Params.Values['User_Name'] := ArqIni.ReadString ('DATABASE','USER',''); ArqIni.Free; try FdConeIndicador.Connected := true; Timer1.Enabled := true; except MessageBox(Handle,'Failed To Connect Database! Check Database Directory.','Bot Zeus', MB_OK MB_ICONERROR); Application.Terminate; end; end;
agora vamos ao login:
procedure TFrmMatricula.BitBtnLoginClick(Sender: TObject); var UserLogin, Name : string; begin // TODA A TRATATIVA SOBRE A CONEXÃO É DESNECESSÁRIA NESTE PONTO. // TUDO FOI FEITO NO ONCREATE DO FORM E, SE CHEGOU ATÉ AQUI, É // É PORQUE A CONEXÃO FOI EFETUADA COM SUCESSO E BASTA SEGUIR // COM O USO DO SISTEMA, SEM QUALQUER PREOCUPAÇÃO COM A CONEXÃO // o FDQryLogin precisa estar fechado ao compilar o projeto if FDQryLogin.Active then FDQryLogin.Close; FDQryLogin.SQL.Text := 'select usuario, nome from cliente where usuario = ' + QuotedStr(Edit1.Text); FDQryLogin.Open; if FDQryLogin.Eof then MessageBox(handle,'Login Failed! Please Check Informed Registration.','Bot Zeus', MB_OK or MB_ICONINFORMATION) else begin UserLogin := FDQryLogin.FieldByName('USUARIO').AsString; Name := FDQryLogin.FieldByName('NOME').AsString; MessageBox(handle,(Pchar('Welcome User '+(UserLogin)+' - '+(Name)+' To Zeus Bot!')),'Zeus Bot', MB_OK + MB_ICONINFORMATION) FrmMatricula.Hide; FrmIndicadorPainel.ShowModal; end; end;
16/09/2021
Emerson Nascimento
procedure TFrmMatricula.FormCreate(Sender: TObject); var ArqIni : TIniFile; directory, nomeini: string; begin directory := ExtractFilePath(ParamStr(0)) + '\\Conf'; nomeini := directory + '\\config.ini'; if not DirectoryExists(directory) then ForceDirectories(directory); if not FileExists(nomeini) then begin ArqIni := TIniFile.Create(NomeIni); ArqIni.WriteString('DATABASE','HOST','25.13.43.171'); ArqIni.WriteString('DATABASE','PORT','3051'); ArqIni.WriteString('DATABASE','DIRECTORY','C:\\Indicator\\Data\\BANCO.FDB'); ArqIni.WriteString('DATABASE','USER','sysdba'); ArqIni.Free; end; ArqIni := TIniFile.Create(NomeIni); FdConeIndicador.Params.Values['Server'] := ArqIni.ReadString ('DATABASE','HOST','25.13.43.171'); FdConeIndicador.Params.Values['Port'] := ArqIni.ReadString ('DATABASE','PORT','3051'); FdConeIndicador.Params.Values['Database'] := ArqIni.ReadString ('DATABASE','DIRECTORY','C:\\Indicator\\Data\\BANCO.FDB'); FdConeIndicador.Params.Values['User_Name'] := ArqIni.ReadString ('DATABASE','USER','sysdba'); ArqIni.Free; try FdConeIndicador.Connected := true; Timer1.Enabled := true; except MessageBox(Handle,'Failed To Connect Database! Check Database Directory.','Bot Zeus', MB_OK MB_ICONERROR); Application.Terminate; end; end;
Clique aqui para fazer login e interagir na Comunidade :)