Parâmetros Firedac - Delphi

Delphi

Firebird

FireDAC

11/09/2021

Bom dia a todos!

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

Jefferson

Curtidas 0

Respostas

Jefferson

Jefferson

11/09/2021

Alguém que possa me ajudar?
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

11/09/2021

não entendi uma coisa... você tem 1 arquivo ini ou 4 arquivos ini?

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
a alteração que eu sugeri grava o arquivo ini da forma apresentada acima.

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



GOSTEI 0
Jefferson

Jefferson

11/09/2021

Olá Emerson! Boa noite!

*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.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

11/09/2021

vamos lá.. você não colocou a implementação do FormCreate() como eu passei. vou passar novamente:
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;
lembrando que você precisa compilar o sistema com o FDConnection DESCONECTADO.

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;
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

11/09/2021

uma pequena alteração no FormCreate()
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;
GOSTEI 0
Jefferson

Jefferson

11/09/2021

Boa noite!
Resolveu o meu problema. Vlw mesmo Emerson.
GOSTEI 0
Gxf

Gxf

11/09/2021

esse emerson é brabo dms!
GOSTEI 0
POSTAR