DatabaseName em Tempo de Execução
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]
Agradeço quem puder me dar uma luz...
Abraços!
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
Curtidas 0
Respostas
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
-----------------------------------------------------
- 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
26/04/2006
sobe :shock:
GOSTEI 0
Aerreira
26/04/2006
Juliano... descomplica... Coloca num arquivo .INI
GOSTEI 0
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
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
26/04/2006
adriano, voce poderia postar aqui a estrutura interna atual do seu arquivo .ini ??
abraços
abraços
GOSTEI 0
Aerreira
26/04/2006
A parte de acesso ao banco é assim:
A ultima linha é comentário. Para lembrar na hora de colocar em produção.
[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
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
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
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
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
Espero ter ajudado
Abraços!
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
26/04/2006
visando ajudar também vou postar a minha procedure para ler o arquivo INI / KEY...
A estrutura do meu ini é essa:
as linhas que começam com são comentários feitos por mim para melhor entendimento do arquivo, espero ter ajudado :wink:
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
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?
Será q pode ser com relação a porta q o Firebird está acessando?
GOSTEI 0
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]
´Unable to complete network request to host 10.1.1.4
Failed to establish a conetion
Unknown Win32 error 10060.´[/img]
GOSTEI 0
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
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
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