DatabaseName em Tempo de Execução

Delphi

26/04/2006

Salve Delphianos... a questão é a seguinte:

Estou querendo fazer o meu sistema funcionar em rede. Para isso optei por usar o registro do windows para armazenar o caminho do meu Banco de Dados...

A parte do sistema que lê o registro e grava ele ja está pronta, tudo funcionando e tudo testado, entao falta só a parte onde o sistema checa o caminho do Banco de dados e passa para o TIBDatabase...

A principio eu nem sei como fazer isso, entao vou postar aqui o que tentei fazer sem obter sucesso.....

No OnCreate do meu Formulário Principal (MDIForm), escrevi o código abaixo:

[b:336c42fa17] Erro Gerado: Access violation at address 04cb7bd in module meuprograma.exe Read of Address 00000058[/b:336c42fa17]

procedure TPrincipal.FormCreate(Sender: TObject);
var
reg     : TRegistry;
Caminho : String;
begin
    // cria o objeto TRegistry
    reg         := TRegistry.Create;
    Reg.Access  := KEY_READ;
    // conecta ao root diferente do padrão
    reg.RootKey := HKEY_LOCAL_MACHINE;
    try
        // se o path nao existir
        if not reg.KeyExists(´Software\ConfigDB´) then
        begin
           // abre o formulário de configuração do banco de dados
           Config_DB := TConfig_DB.Create(nil);
           Config_DB.ShowModal;
        end
            else // se a chave existir
                begin
                     //le o caminho
                     Reg.OpenkeyReadOnly(´Software\ConfigDB\´);
                     caminho := Reg.ReadString(´configuracoes´);
                     Reg.closekey;
                     
                    {***********PROBLEMA AQUI****************}

                     //informa ao DB dentro do DataModule o caminho
                     DM.DB_UF.DatabaseName := Caminho;
                     DM.DB_UF.Connected    := true;

                    {****************************************}         

                end;
    finally
    reg.Free;
    end;
end;


Agradeço quem puder me dar uma luz...
Abraços!


Mahdak

Mahdak

Curtidas 0

Respostas

Mahdak

Mahdak

26/04/2006

só algumas observações que esqueci de fazer:
-----------------------------------------------------
- Delphi 7
- Firebird 1.5
- O sistema está em uma partição ´D:´
- O DatabaseName do TIBDatabase no servidor := juliano:D:\Xst\tmp\Sistema_Rede\Configdb.fdb


GOSTEI 0
Mahdak

Mahdak

26/04/2006

sobe :shock:


GOSTEI 0
Aerreira

Aerreira

26/04/2006

Juliano... descomplica... Coloca num arquivo .INI


GOSTEI 0
Mahdak

Mahdak

26/04/2006

Juliano... descomplica... Coloca num arquivo .INI


aerreira, usando um arquivo .ini ou usando o RegEdit o processo é o mesmo, ou seja, teóricamente o sistema tem que:

1. ler o caminho do banco gravado em um arquivo ´caso do .ini´ ou numa chave ´caso do regitro do windows´;
2. jogar esse caminho numa string;
3. passar a informação contida na string para a propriedade DataBaseName do meu TIBDataBase para que o sistema possa conectar com o banco de dados na rede.

Até a parte 2 do processo eu ja matei a charada... o problema agora é a parte 3 que nao tenho ideia de como proceder.

Obs: ressalto novamente que optei pelo registro do windows por motivos de segurança...

Abração a todos e espero que alguem possa me ajudar com isso... :D


GOSTEI 0
Aerreira

Aerreira

26/04/2006

Tenho um caso aqui que faço assim:
procedure TdmCON.DataModuleCreate(Sender: TObject);
var
  myINI : TINIFile;
  fileinfo : VS_FIXEDFILEINFO;
begin
  myINI := TINIFile.Create(ExtractFilePath(Application.EXEName) + ´grs.ini´);
  application.processmessages;
  try
    begin
      db.AllowStreamedConnected := false;
      db.connected := false;
      db.DatabaseName := myINI.ReadString(´Geral´, ´Banco de Dados´, ´grs.gdb´);
      db.Params.add(´user_name=sysdba´);
      db.Params.add(´password=masterkey´);
      db.connected := true;
    end;
  except
    begin
      raise Exception.Create( ´O banco de dados não foi aberto corretamente.´);
      application.terminate;
    end;
  end;
  myINI.Free;
  tran.Active := true;
end;



GOSTEI 0
Mahdak

Mahdak

26/04/2006

adriano, voce poderia postar aqui a estrutura interna atual do seu arquivo .ini ??

abraços


GOSTEI 0
Aerreira

Aerreira

26/04/2006

A parte de acesso ao banco é assim:

[Geral]
Banco de Dados=c:\delphi\grs\grs.gdb
Banco de Dados=200.178.123.32:/grs.gdb


A ultima linha é comentário. Para lembrar na hora de colocar em produção.


GOSTEI 0
Fferreira

Fferreira

26/04/2006

E ai pessoal, muito boa as dicas de vcs, fiz tudo conforme o figurino. Estava tudo funcionando perfeitamente. Mas foram feitos upgrade nas maquinas. E agora naum esta mais funcionando. O arquivo Ini esta no local especificado o banco tb. Mas minha aplicacao cliente não consegue se comunicar com o banco.
Por acaso preciso criar algum ´alias´ no Firebird Cliente ou apenas configuro o DataBaseName com o endereço do banco no servidor como estou fazendo como vc mostraram com arquivo .ini

Obs.: O servidor naum é um servidor dedicado e sim um Pc com 1GB de Ram, Amd 64 3800, com win xp professional

Se puderem me ajudar agradeço... naum sei mais o q fazer

Firebird Versão 1.5 baixada do site www.firebird.com.br em 07.06.2006
Desenvolvido em Delphi 7
Componente utilizado: IBDataBase, IBTransaction, IBQuery
Relatórios: RaveReport


GOSTEI 0
Mahdak

Mahdak

26/04/2006

bom. decidi usar o registro do windows por medidas de segurança, e aqui está funcionando que é uma beleza, tanto em usuarios administradores, quanto em usuarios limitados. vou postar aqui os passos:

1. no DataModule eu criei um procedure pra verificação do caminho do banco e a sua conecção...

USES : Windows, Registry

Procedure LeReg;
var
reg     : TRegistry;
Caminho : String;
begin
    // cria o objeto TRegistry
    reg         := TRegistry.Create;
    Reg.Access  := KEY_READ;
    // conecta ao root diferente do padrão
    reg.RootKey := HKEY_LOCAL_MACHINE;
    try
        // se o path nao existir chama o form que configura o path  "Config_DB"
        if not reg.KeyExists(´Software\SeuSistema´) then
        begin
           Config_DB := TConfig_DB.Create(nil);
           Config_DB.ShowModal;
        end
            else // se a chave existir
                begin
                     //le o caminho
                     Reg.OpenkeyReadOnly(´Software\SeuSistema´);
                     caminho := Reg.ReadString(´configuracoes´);
                     Reg.closekey;

                     //informa ao DB dentro do DataModule o caminho

                     DM.DB_Login.AllowStreamedConnected := false;
                     DM.DB_Login.connected              := false;
                     DM.DB_Login.DatabaseName           := Caminho;
                     DM.DB_Login.Params.add(´user_name=sysdba´);
                     DM.DB_Login.Params.add(´password=masterkey´);
                     DM.DB_Login.connected              := true;                   

                end;
    finally
    reg.Free;

    DM.Tr_Login.Active          := true;
    DM.Tbl_Login.Active         := true;
    
    end;
end;


2. No Oncreate do DataModule chame a procedure ´LeReg´


3. Os códigos sobre o form que configura o path ´Config_DB´ :

USES : Windows, Registry

Procedure CriaReg; // cria chave no RegEdit
var
reg     : TRegistry;
caminho : String;
begin
    // cria o objeto TRegistry
    reg         := TRegistry.Create;
    // conecta ao root diferente do padrão
    reg.RootKey := HKEY_LOCAL_MACHINE;
    caminho     := Config_DB.Edit_Caminho.Text;
    try
        // se o path nao existir
        if not reg.KeyExists(´Software\SeuSistema´) then
        begin
            reg.CreateKey(´Software\SeuSistema´);
            // abre a chave (no root selecionado)
            reg.OpenKey(´Software\SeuSistema´, True);
            // grava o valor da chave em formato String
            reg.WriteString(´configuracoes´, caminho);
            ShowMessage(´Banco configurado com sucesso.´);
            Config_Db.Close;
        end
            else // se a chave existir
                begin
                    // abre a chave (no root selecionado)
                    reg.OpenKey(´Software\SeuSistema´, True);
                    // grava o valor da chave em formato String
                    reg.WriteString(´configuracoes´, caminho);
                    ShowMessage(´Banco configurado com sucesso.´);
                    Config_Db.Close;
                end;

    finally
    reg.Free;
    end;
end;

Procedure LeReg; // Le o o valor criado na chave do RegEdit
var
reg     : TRegistry;
caminho : String;
begin
    // cria o objeto TRegistry
    reg         := TRegistry.Create;
    // conecta ao root diferente do padrão
    reg.RootKey := HKEY_LOCAL_MACHINE;
    try
        begin
            //le o caminho e informa ao DB dentro do DataModule
            Reg.OpenkeyReadOnly(´Software\SeuSistema´);
            caminho := Reg.ReadString(´configuracoes´);
            Reg.closekey;
            Config_DB.Edit_Caminho.Text := Caminho;
        end;
    finally
    reg.Free;
    end;
end;


procedure TConfig_Db.Btn_SalvarClick(Sender: TObject);
begin
     CriaReg;     
end;

procedure TConfig_Db.Btn_CancelarClick(Sender: TObject);
begin
    Close;
end;

procedure TConfig_Db.FormShow(Sender: TObject);
begin
    LeReg;
end;

procedure TConfig_Db.SpeedButton1Click(Sender: TObject);
begin
    OpenDialog1.InitialDir := Application.ExeName;
    if OpenDialog1.Execute then
    Edit_Caminho.Text      := OpenDialog1.FileName;
end;



Espero ter ajudado
Abraços!


GOSTEI 0
Paullsoftware

Paullsoftware

26/04/2006

visando ajudar também vou postar a minha procedure para ler o arquivo INI / KEY...

Procedure LerConfig;
var
   NomeArq:String;
   ArqIni:TiniFile;
begin
 NomeArq := ChangeFileExt(Application.ExeName,´.ini´);
 ArqIni := TIniFile.Create(NomeArq);
  Try
  { Pego o path da base de dados }
  PathServerBase      := ArqIni.ReadString(´Parameters´,´BASE´,PathServerBase);
  { Aplicativo responsavel pelo monitoramento e criação dos backup´s }
  PathExeBackup       := ArqIni.ReadString(´Parameters´,´AppBackup´,PathExeBackup);
  finally
  ArqIni.Free;
 end;
End;

A estrutura do meu ini é essa:

#Dados para acesso a Base de dados e Módulos auxiliares ******************************************************************** [Parameters] ESTA BASE É LOCAL BASE=LOCALHOST:D:\Delphi\Projetos\Locadora(GAIBU)\DBLOC7023.GDB $BASE=LOCALHOST:D:\Delphi\Projetos\Locadora(GAIBU)\_DBLOC7023.GDB AppImport=D:\Delphi\Projetos\Locadora(GAIBU)\Import\appImport.exe AppBackup=D:\Delphi\Projetos\Locadora(GAIBU)\Service\appBack.exe #Dados para atualização do Executável da aplicação ******************************************************************** [UpDate] Atualizador=D:\Delphi\Projetos\Locadora(GAIBU)\UpDate.exe Origem=D:\Delphi\Projetos\Locadora(GAIBU)\UpDate\loc.udp Destino=D:\Delphi\Projetos\Locadora(GAIBU)\loc.exe Dados para Importação dos Dados (Clientes/Dependentes) do plano ******************************************************************** [IMPORTAÇÃO] TITULAR=D:\Delphi\Projetos\Locadora(GAIBU)\Remessa\txtTitu.txt CONJ=D:\Delphi\Projetos\Locadora(GAIBU)\Remessa\txtConjs.txt DEPDS=D:\Delphi\Projetos\Locadora(GAIBU)\Remessa\txtDeps.txt Datas para checagem dos arquivos importados #******************************************************************** DATA_T=20/02/2006 15:19:42 DATA_C=20/02/2006 09:20:50 DATA_D=20/02/2006 07:55:05

as linhas que começam com são comentários feitos por mim para melhor entendimento do arquivo, espero ter ajudado :wink:


GOSTEI 0
Fferreira

Fferreira

26/04/2006

Perfeito pessoal, excelente. Mas o problema é que mesmo assim ele naum está conseguindo acessar o banco no servidor.
Será q pode ser com relação a porta q o Firebird está acessando?


GOSTEI 0
Fferreira

Fferreira

26/04/2006

Este é o erro q esta acontecendo, tanto quando uso ini quando uso registro.

´Unable to complete network request to host 10.1.1.4
Failed to establish a conetion
Unknown Win32 error 10060.´[/img]


GOSTEI 0
Paullsoftware

Paullsoftware

26/04/2006

Este é o erro q esta acontecendo, tanto quando uso ini quando uso registro. ´Unable to complete network request to host 10.1.1.4 Failed to establish a conetion Unknown Win32 error 10060.´[/img]


foi mal mais nesse caso o problema não está no caminho está na máquina da rede que não está acessível...
tente abrir esse mesmo banco em tempo de desenvolvimento...


GOSTEI 0
Titanius

Titanius

26/04/2006

Este é o erro q esta acontecendo, tanto quando uso ini quando uso registro. ´Unable to complete network request to host 10.1.1.4 Failed to establish a conetion Unknown Win32 error 10060.´[/img]


Com certeza este erro está no servidor... ou seja, ele nao está deixando ninguem conectar nele.. verifique o firewall, caso exista, e se o Server do firebird está funcionando corretamente...


[]s


GOSTEI 0
Aerreira

Aerreira

26/04/2006

Este é o erro q esta acontecendo, tanto quando uso ini quando uso registro. ´Unable to complete network request to host 10.1.1.4 Failed to establish a conetion Unknown Win32 error 10060.´[/img]


Já verificou se o Firebird está devidamente instalado no servidor e nos clientes?


GOSTEI 0
POSTAR