Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Erro ao alterar caminho do firebird com dbexpress


nicolasbraz

Pergunta

Bom dia galera,
Estou usando os componentes da paleta dbexpress com firebird e toda a vez que eu vou alterar o caminho do banco ele não consegue se conectar é necessário fechar a aplicação e abrir de novo.
  Try
    iniconf:=Tinifile.Create(ExtractFilePath(application.exename)+'config.ini');
    iniconf.writestring('PDV','Database',      '' + edtCaminho.Text);
    try
      dm.conexao.Connected           := false;
      dm.conexao.ConnectionName       :='PDV'; //Nome do Driver válido ***
      dm.conexao.DriverName           :='FIREBIRD';
      dm.conexao.LoadParamsFromIniFile('config.ini');
      dm.conexao.Connected           := True;
      ShowMessage('Conexão realizada com sucesso.');
    except
      ShowMessage('Erro ao conectar a nova base de dados! Contate o suporte.');
   end;
    btnFecharClick(self);
  except
    showmessage('Erro na conexão com o Banco de Dados.');
  end;
Link para o comentário
Compartilhar em outros sites

21 respostass a esta questão

Posts Recomendados

  • 0

toda a vez que eu vou alterar o caminho do banco ele não consegue se conectar é necessário fechar a aplicação e abrir de novo.

Try
    iniconf:=Tinifile.Create(ExtractFilePath(application.exename)+'config.ini');
    iniconf.writestring('PDV','Database',      '' + edtCaminho.Text);
    try
      dm.conexao.Connected           := false;
      dm.conexao.ConnectionName       :='PDV'; //Nome do Driver válido ***
      dm.conexao.DriverName           :='FIREBIRD';
      dm.conexao.LoadParamsFromIniFile('config.ini');
      dm.conexao.Connected           := True;
      ShowMessage('Conexão realizada com sucesso.');
    except
      ShowMessage('Erro ao conectar a nova base de dados! Contate o suporte.');
   end;
    btnFecharClick(self);
  except
    showmessage('Erro na conexão com o Banco de Dados.');
  end;

veja que voce fechando o programa e abrindo ele novamente, esse comando consegue ser executado

dm.conexao.LoadParamsFromIniFile('config.ini');

a pergunta é : houve tempo suficiente para que esse comando fosse executado ?

iniconf:=Tinifile.Create(ExtractFilePath(application.exename)+'config.ini');
iniconf.writestring('PDV','Database', '' + edtCaminho.Text);

experimente usar o comando Sleep(300) sleep time em millisegundos para ver se resolve

tipo:

sleep(1000); // esperar 1 segundo para executar o proximo comando

dm.conexao.LoadParamsFromIniFile('config.ini');

OBS: se não resolver tente colocar esses comandos no active do form ou outro lugar

iniconf:=Tinifile.Create(ExtractFilePath(application.exename)+'config.ini');
iniconf.writestring('PDV','Database', '' + edtCaminho.Text);

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

O conteúdo é esse.

[PDV]
drivername=FIREBIRD
blobsize=-1
commitretain=False
Database=C:\Sistemas\Automacao\ADM\BD\pdv.FDB
localecode=0000
password=masterkey
rolename=RoleName
sqldialect=3
isolationlevel=ReadCommitted
user_name=sysdba
waitonlocks=True
trim char=False
servidor=localhost
O estranho Jhonas é o seguinte na minha máquina de desenvolvimento o código funciona eu consigo mudar a base de dados, agora em outros computadores ele dá erro!
Link para o comentário
Compartilhar em outros sites

  • 0
iniconf:=Tinifile.Create(ExtractFilePath(application.exename)+'config.ini');
iniconf.writestring('PDV','Database', '' + edtCaminho.Text);
try
dm.conexao.Connected := false;
dm.conexao.ConnectionName :='PDV'; //Nome do Driver válido ***
dm.conexao.DriverName :='FIREBIRD';
dm.conexao.LoadParamsFromIniFile('config.ini');
dm.conexao.Connected := True;
ShowMessage('Conexão realizada com sucesso.');
except
ShowMessage('Erro ao conectar a nova base de dados! Contate o suporte.'); // O ERRO ACONTECE AQUI
end;
btnFecharClick(self);
A mensagem que me aparece é só essa como eu estou em uma máquina cliente não aparece mais nada.
Link para o comentário
Compartilhar em outros sites

  • 0

bem, creio que voce esta alterando esse caminho quando vai trocar o banco de dados ... certo ?

Database=C:\Sistemas\Automacao\ADM\BD\pdv.FDB

suponho que na maquina cliente o caminho seja o mesmo ....

na sua maquina de desenvolvimento o problema não ocorre porque, mesmo que o banco esteja em outro diretorio, ainda assim sera c: ou d: o caminho do banco

mas se voce estiver em rede, a definição do caminho começa por \\ nomedocomputador\ e não c:

voce deve verificar se realmente o novo caminho foi alterado antes de abrir novamente a conexão

vou fazer uns testes aqui para ver se consigo repetir o seu problema

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas,

Não estou tentando testar em rede!

Imagina a seguinte situação:

Eu coloco o sistema em um cliente e nele eu deixo meu database em branco correto?

Quando abrir o sistema eu clico em configurar o local da base e é feito aquele código do post ele chega a escrever no config.ini mas não consegue ler o que está lá dai eu tenho que fechar a aplicação e abrir de novo que ele vai conectar.

Link para o comentário
Compartilhar em outros sites

  • 0

leia o artigo a paritr desse ponto ( com atenção )

será nossa a responsabilidade de passar um Arquivo Ini Válido , para isto iremos carregar este Arquivo ini para a propriedade params do SqlConexao . Para fazer isto temos os métodos Params.LoadFromFile ou LoadParamsFromIniFile . Há uma diferença sutil e significativa entre eles .

OBS: como eu disse, testei e funcionou... então voce deve verificar onde esta o problema no seu código

Somente como sugestão: tente refazer a partir do zero caso não encontre o problema

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas,

Refiz o código todo agora e li novamente o artigo do Marcos Salles, na minha máquina de desenvolvimento o código funciona perfeitamente!

Agora quando eu uso a minha máquina virtual (para simular o uso em um cliente) ele não consegue conectar, eu testei das duas maneiras com o LoadParamsFromIniFile e com o Params.LoadFromFile e o erro continua.

Eu me atentei a parte do tutorial onde ele explica que no Params.LoadFromFile nós devemos passar o driverName antes do Params.LoadFromFile e no caso do LoadParamsFromIniFile eu posso passar o driverName antes.

Estou começando a pensar que o problema é que eu tento alterar os dados diretamente do objeto que já está criado no meu dataModule e nesse tutorial ele cria a conexão dinamicamente pode ser também porque o meu datamodule já está criado.

Editado por nicolasbraz
Link para o comentário
Compartilhar em outros sites

  • 0

tente usando essa lógica

Config.Ini

DriverName=Firebird
Database=C:\Sistemas\Automacao\ADM\BD\pdv.FDB
RoleName=RoleName
User_Name=sysdba
Password=disk1234
ServerCharSet=win1252
SQLDialect=3
ErrorResourceFile=
LocaleCode=0000
BlobSize=-1
CommitRetain=False
WaitOnLocks=True
TransIsolation=ReadCommited
Trim Char=False

==============================================================

procedure TForm1.Button1Click(Sender: TObject);
begin
try

SQLConnection1.ConnectionName:='Firebird';
SQLConnection1.LoadParamsOnConnect:=False;
SQLConnection1.LoadParamsFromIniFile('c:\config.ini');

SQLConnection1.DriverName:='Firebird';
SQLConnection1.LoginPrompt:=false;

SimpleDataSet1.Active := false;
SimpleDataSet1.Active := true;
finally
SQLConnection1.Free;
end;
end;

=============================================================================

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
SQLConnection1.Connected := false;
SQLConnection1.Connected := true;

ShowMessage('Conexão realizada com sucesso.');

end;

==============================================================================

procedure TrocarCaminhodoBanco;
begin
SQLConnection1.Connected := false;

// rotina para trocar o caminho do banco de dados do arquivo Config.ini

SQLConnection1.Connected := true;
end;

======================================================================

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas,

Esse SQLConnection não é criado dinamicamente correto?

A lógica desse não é igual ao meu código?

iniconf:=Tinifile.Create(ExtractFilePath(application.exename)+'config.ini');
iniconf.writestring('PDV','Database', edtCaminho.Text);
try
dm.conexao.Connected := false;
dm.conexao.ConnectionName :='PDV'; //Nome do Driver válido ***
dm.Conexao.LoadParamsOnConnect := False;
dm.Conexao.LoadParamsFromIniFile('config.ini');
dm.conexao.DriverName :='FIREBIRD';
dm.conexao.Connected := True;
ShowMessage('Conexão realizada com sucesso.');
showmessage(dm.Conexao.Params.Text);
except
ShowMessage('Erro ao conectar a nova base de dados! Contate o suporte.');
end;
btnFecharClick(self);
Editado por nicolasbraz
Link para o comentário
Compartilhar em outros sites

  • 0

E o delphi está me dando esse erro.

dbx error: Database must be specified.

dbx erro: Base de dados deve ser especificado

-------------------------------------------------------------------

com relação a pergunta anterior ... a lógica não é a mesma não, tem ligeiras diferenças

da maneira como te passei esta funcionando ... sugiro a voce começar do zero novamente ( a rotina de conexão do banco de dados ) ou trocar por outro componente de conexão com o banco de dados

veja se ajuda esses links

https://www.darcweb.com.br/posts/view/2/31/Conectando+sua+aplicacao+em+Delphi+com+banco+de+dados+FireBird.dhtml

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas,

Eu tenho sistemas com a paleta IBX, esse sistema que eu estou usando dbexpress já tenho 50 tabelas configurados não posso trocar agora os componentes, a forma que você fez acima usava componentes também correto? Não era criado nada dinamicamente, no exemplo você passou 2 códigos para button1 poderia me explicar em qual situação seria usado aqueles códigos? Ao abrir o form, ao fechar?

Link para o comentário
Compartilhar em outros sites

  • 0

No exemplo que te passei usa componente sim ... então vamos por partes

no arquivo config.ini voce coloca o caminho para o banco de dados da sua aplicação

Config.Ini

DriverName=Firebird
Database=C:\Sistemas\Automacao\ADM\BD\pdv.FDB
RoleName=RoleName
User_Name=sysdba
Password=disk1234
ServerCharSet=win1252
SQLDialect=3
ErrorResourceFile=
LocaleCode=0000
BlobSize=-1
CommitRetain=False
WaitOnLocks=True
TransIsolation=ReadCommited
Trim Char=False

==============================================================

depois no form voce coloca um botão para que ao ser executado o código, o arquivo config ini seja carregado e executado

procedure TForm1.Button1Click(Sender: TObject);
begin
try

TrocarCaminhodoBanco; // chama a rotina para trocar o caminho do banco de dados

SQLConnection1.Connected := false;

SQLConnection1.ConnectionName:='Firebird';
SQLConnection1.LoadParamsOnConnect:=False;
SQLConnection1.LoadParamsFromIniFile('c:\config.ini');

SQLConnection1.DriverName:='Firebird';
SQLConnection1.LoginPrompt:=false;


SQLConnection1.Connected := true;

ShowMessage('Conexão realizada com sucesso.');


//SimpleDataSet1.Active := false;
//SimpleDataSet1.Active := true;
finally
SQLConnection1.Free;
end;
end;

=============================================================================

Uma vez constatado que o banco de dados foi conectado, voce troca o caminho para outro banco de dados e testa novamente

( faz isso na mão mesmo )

uma vez que tenha funcionado, agora voce vai usar uma rotina para trocar o caminho para o banco de dados que esta no

arquivo config.ini

procedure TrocarCaminhodoBanco;
begin

// rotina para trocar o caminho do banco de dados do arquivo Config.ini

// aqui voce le a linha onde esta o caminho para o banco de dados

AssignFile(Arquivo, 'C:\config.ini');
Reset(Arquivo);
while not EOF(Arquivo) do
begin
l := l + 1;
ReadLn(Arquivo, Line);
if l = 2 then
local := trim(line);

showmessage(local);

// aqui voce troca o caminho para o banco de dados e salva o arquivo

// Edit1.text := 'Database=D:\Sistemas\Automacao\ADM\BD\pdv1.FDB'

writeln(arquivo, Edit1.Text); // insere dados no arquivo

end;
CloseFile(Arquivo);

end;

======================================================================

OBS: seria isso .... mas me lembrei de uma coisa importante que aconteceu comigo

as vezes o proprio componente pode gerar esse tipo de problema, então voce deve deletar o componente do form

e adiciona-lo novamente .

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas,

Enfim voltei a mexer com esse problema e hoje eu resolvi pelo que eu vi faltavam informações para fazer a conexão adicionando o código abaixo funcionou.

  try
    dm.Conexao.Close;
    dm.conexao.Connected                 := false;
    dm.conexao.ConnectionName            :='PDV'; //Nome do Driver válido ***
    dm.Conexao.LoadParamsOnConnect       := False;
    dm.Conexao.LoadParamsFromIniFile(ExtractFilePath(application.exename)+'config.ini');
    dm.conexao.DriverName                :='FIREBIRD';
    dm.Conexao.LibraryName               := 'dbxfb.dll';
    dm.Conexao.Params.Values['User_Name']:= 'SYSDBA';
    dm.Conexao.Params.Values['Password'] := 'masterkey';
    dm.Conexao.Params.Values['Database'] := edtCaminho.Text;
    dm.conexao.Connected                 := True;
    ShowMessage('Conexão realizada com sucesso.');
  except
    on e:exception do
       ShowMessage(e.Message);
  end;
Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...