Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   configurar IBDataBase mediante un archivo ini o txt (https://www.clubdelphi.com/foros/showthread.php?t=81508)

angel.sosa 20-11-2012 18:06:53

configurar IBDataBase mediante un archivo ini o txt
 
hola a todos, soy nuevo en el foro, estoy programando una pequeña aplicacion en Delphi 7 para correrla con una base de datos en red, por cierto estoy usando un tutorial para novatos de caral muy bueno, la cuestion es que pretendo configurar los parametros de conexion del IBDataBase con un archivo ya sea de texto o un ini, en el cual tendria la ip del servidor, el tipo de conexion y el usuario y contraseña, pues la idea es instalar la aplicacion con ese archivo de configuracion para conectarse.

MartinS 20-11-2012 23:05:01

Hola angel:

El siguiente codigo lo pones en el evento OnCreate de un DataModule o bien donde tenes los componentes de conexion:

Código Delphi [-]
Uses IniFiles;

procedure TDM.DataModuleCreate(Sender: TObject);
Var BaseDeDatos: String;
    IniFile: TIniFile;
begin
   // Obtiene la ruta y el nombre de la base de datos
   IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'BDatos.ini');
   BasedeDatos := IniFile.ReadString('BD','Path','');
   If BasedeDatos = '' then
    ShowMessage('Error al cargar Base de Datos') else
   Begin
    Try
      BaseGeneral.DatabaseName := BaseDeDatos;
      BaseGeneral.Connected := True;
      Transaccion.Active := True;
    Except
      ShowMessage('No se puede conectar el servidor...');
    End;
   End;
end;

y esto es lo que iria dentro del archivo BDatos.Ini de las maquinas clientes y lo ubicarias en el mismo lugar del ejecutable. La IP que aparece corresponde a la maquina donde se encuentra la base de datos

Código:

[DB]
PATH="192.168.1.3:c:\Sistema\Datos\LaBase.FDB"

en tanto para el .ini donde esta la base, el ini no lleva la Ip

Código:

[DB]
PATH=":c:\Sistema\Datos\LaBase.FDB"


Fijate que la variable BaseDeDatos se carga con el valor de PATH del ini
Código Delphi [-]
BasedeDatos := IniFile.ReadString('BD','Path','');
es decir que puedes agregar mas parametros a otras variables y leerlo de la misma forma, por ejemplo
Código:

[DB]
PATH=":c:\Sistema\Datos\LaBase.FDB"
PASS="masterkey"
USER="SYSDBA"
UBICACION="Algo que se te ocurra"


Saludos.-

Pd: Supongo que la base de datos es firebird o Intebase.-

Faust 20-11-2012 23:13:40

Me ganaron n responder :p

Pero así es la cuestión como dice el amigo Martín... checa este enlace para mayor referencia... http://primero.latinowebs.com/delphi1/Ficheini.htm... y piensa si es conveniente poner la pass de la base de datos en un archivo ini que es un simple archivo de texto.

Saludos

angel.sosa 20-11-2012 23:46:39

gracias MartinS, por el momento solo quiero pasar la ip y la ruta de la base, solo me queda unas cuantas dudas, como le digo al componente IBDataBase que utilice esos parametros que acabo de extraer del ini. es decir como le asigno los parametros. antes los parametros de la conexion estaban dentro del IBdatabase mediante su editor, es decir en esta parte no utilice codigo.

entiendo q es la parte donde me dices q use algo asi como: BaseGeneral.DatabaseName := BaseDeDatos;

pero no entiendo q hacer en esta parte o como ingresarle esos parametros al componente.

MartinS 21-11-2012 01:12:17

Hola: Los parametros se los definis como estas acostumbrado o como estas aprendiendo, o sea, desde el editor. El código que te expuse solo cambia o define en su caso la ruta de la base de datos cuando se ejecuta. Como bien expuso Faust el usuario y la contraseña (SYSDBA y masterkey) la colocas al componente en tiempo de diseño.
En el ejemplo BaseGeneral seria tu componenete IbDatabase.
En cuanto a la ruta de la base de datos y tomando el ejemplo: c:\Sistema\Datos\LaBase.FDB es la ubicación física de la base dentro de la PC servidora. Cuando definís el acceso a la misma por los parametros del IBDatabase en tiempo de diseño (Database component editor - es decir boton derecho sobre el componente) le indicas que use el protocolo TPC y conexion tipo remota y la ubicacion fisica de la base de datos, entonces el mismo componente le agregara los : delante de la ruta quedando :c:\Sistema\Datos\LaBase.FDB. Despues viene todo el tema del .ini. Otra vez; cada cliente sumara al .ini a la ruta la ip del servidor salvo el .ini del que realmente tiene la base de datos.

Saludos y espero que no te halla confundido mas.- ^\||/

angel.sosa 21-11-2012 21:56:04

Cita:

Empezado por MartinS (Mensaje 450037)
Hola: Los parametros se los definis como estas acostumbrado o como estas aprendiendo, o sea, desde el editor. El código que te expuse solo cambia o define en su caso la ruta de la base de datos cuando se ejecuta. Como bien expuso Faust el usuario y la contraseña (SYSDBA y masterkey) la colocas al componente en tiempo de diseño.
En el ejemplo BaseGeneral seria tu componenete IbDatabase.
En cuanto a la ruta de la base de datos y tomando el ejemplo: c:\Sistema\Datos\LaBase.FDB es la ubicación física de la base dentro de la PC servidora. Cuando definís el acceso a la misma por los parametros del IBDatabase en tiempo de diseño (Database component editor - es decir boton derecho sobre el componente) le indicas que use el protocolo TPC y conexion tipo remota y la ubicacion fisica de la base de datos, entonces el mismo componente le agregara los : delante de la ruta quedando :c:\Sistema\Datos\LaBase.FDB. Despues viene todo el tema del .ini. Otra vez; cada cliente sumara al .ini a la ruta la ip del servidor salvo el .ini del que realmente tiene la base de datos.

Saludos y espero que no te halla confundido mas.- ^\||/


mas o menos claro, ahora estoy corriendo la aplicacion local pero no me arroja nunca la conexion
me marca esto como que no reconoce el PATH ("Error al cargar Base de Datos"), y el ini lo tengo en la misma carpeta de el proyecto.
Código Delphi [-]
begin
  // Obtiene la ruta y el nombre de la base de datos
   IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'BDatos.ini');
   BasedeDatos := IniFile.ReadString('BD','Path','');
   If BasedeDatos = '' then
    ShowMessage('Error al cargar Base de Datos') else
   Begin
    Try
      IBDatabase1.DatabaseName := BaseDeDatos;
      IBDatabase1.Connected := True;
     // Transaccion.Active := True;
    Except
      ShowMessage('No se puede conectar el servidor...');
    End;
   End;

error al cargar la base de datos. siempre

el codigo del BDatos.ini donde esta mi base local.
Código:

[DB]
PATH=":C:\bdnueva\TSTD_LOCAL.FDB"


Casimiro Notevi 21-11-2012 22:46:19

PATH=":C:\bdnueva\TSTD_LOCAL.FDB"

Ese : delante sobra

ecfisa 21-11-2012 23:19:13

Hola.

Y una vez que quites lo que acertadamente te señala Casimiro, tenes que realizar otra corrección.

En el archivo BDatos.Ini la sección figura con el nombre:
Código:

[DB]
PATH=C:\bdnueva\TSTD_LOCAL.FDB ;Se puede prescindir de las comillas (" ")

Y desde tu código la estás referenciando como:
Código Delphi [-]
 BasedeDatos := IniFile.ReadString('BD',...  // Aquí también debe ser DB
O claro está, también podrías cambiar el nombre de la sección en BDatos.ini...

Saludos.

angel.sosa 21-11-2012 23:47:45

---------------------------
Debugger Exception Notification
---------------------------
Project descuentos.exe raised exception class EAccessViolation with message 'Access violation at address 004BAECA in module 'descuentos.exe'. Read of address 0000009C'.
---------------------------
Break Continue Help
---------------------------
lista las correciones, ahora me marca esto de arriba en esta parte del codigo.
Código Delphi [-]
    Try
      IBDatabase1.DatabaseName := BaseDeDatos;
      IBDatabase1.Connected := True;
      // Transaccion.Active := True;
    Except
      ShowMessage('No se puede conectar el servidor...');
    End;
y me manda el mensaje No se puede conectar el servidor. despues de darle break.

MartinS 22-11-2012 02:09:55

Hola: con respecto a los : delante de la ruta a mi me funciona. En algún lugar vi que si la conexión es remota se ponen esos : (si lo encuentro lo coloco aquí) como tambien lo tengo con las " . Ahora esta bien la observación de ecfisa sobre el nombre del parámetro del ini ya que por código le dije que leyera DB y en el ini de ejemplo te puso BD. Tendrías que fijarte si la variable que le asignas la ruta es realmente eso y recorda que el ini va donde esta el .exe (debug-Win32...).

Saludos

MartinS 22-11-2012 02:42:17

No tomes lo de debug-Win32.. Porque pensé que trabajabas con Delphi 2007.

Saludos

Casimiro Notevi 22-11-2012 11:46:03

Cita:

Empezado por MartinS (Mensaje 450131)
Hola: con respecto a los : delante de la ruta a mi me funciona. En algún lugar vi que si la conexión es remota se ponen esos : (si lo encuentro lo coloco aquí) como tambien lo tengo con las " .

Funcione o no funcione, está mal.

Una ruta de ejemplo mediante IP (es lo más adecuado):
192.168.1.100:/datos/labasedatos.fdb

También puede ser el nombre del servidor:
elservidor:/datos/labasedatos.fdb

En windows:
mediante IP (es lo más adecuado)
192.168.1.100:c:\datos\labasedatos.fdb

Mediante nombre servidor:
elservidor:c:\datos\labasedatos.fdb

Incluso en una conexión local se recomienda la IP o localhost:
linux
127.0.0.1:/datos/labasedatos.fdb
localhost:/datos/labasedatos.fdb

windows
127.0.0.1:c:\datos\labasedatos.fdb
localhost:c:\datos\labasedatos.fdb

MartinS 22-11-2012 13:21:12

Cita:

Empezado por Casimiro Notevi (Mensaje 450151)
Funcione o no funcione, está mal.

Si, pero funciona :p

Creo que en definitiva tiene el problema o bien en la ubicacion del .ini o en la observacion que hizo ecfisa en cuanto a BD por DB

Saludos.-

Casimiro Notevi 22-11-2012 13:46:54

Cita:

Empezado por MartinS (Mensaje 450158)
Si, pero funciona :p

Veamos, un coche anda con una rueda pinchada e incluso con un cilindro fallando.
Dirás que funciona, vale, pero no funciona bien, va "renqueando".
Incluso si le quitas las ruedas, también funciona.
Esos dos puntos delante están mal, quieras o no quieras.
Pero si te gusta dejarlos ahí, pues nada, déjalo y sigue con el coche sin ruedas :p, que funciona :D

ecfisa 22-11-2012 13:55:38

Hola.

Por lo que comenta angel.sosa en el mensaje #9 parece que logró solucionar ese tema, ahora habla de un error de Access Violation.

Angel, no sé como tenes distribuido los componentes, pero si tenes un TDataModule y ejecutas el código que mencionas en el evento OnCreate te va a provocar problemas... Te conviene asegurarte que todos los objetos hayan sido creados.

Por ejemplo:
Código Delphi [-]
unit DataModule

interface

uses
  Windows, Messages, SysUtils, Classes, IBDatabase, DB;

const
  WM_AFTER_CREATE = WM_USER + 300;

type
  TDataModule2 = class(TDataModule)
    IBTransaction1: TIBTransaction;
    IBDatabase1: TIBDatabase;
    procedure DataModuleCreate(Sender: TObject);
  private
    procedure WmAfterCreate(var Msg: TMessage); message WM_AFTER_CREATE;
  public
  end;

var
  DataModule2: TDataModule2;

implementation {$R *.dfm}

uses IniFiles, Forms, Dialogs;

procedure TDataModule2.WmAfterCreate(var Msg: TMessage);
begin
  with TIniFile.Create(ExtractFilePath(Application.ExeName)+'BDatos.ini') do
  try
    IBDatabase1.DatabaseName:= ReadString('BD', 'Path','');
    IBDatabase1.Params.Clear;
    IBDatabase1.Params.Add('user_name='+ReadString('BD', 'User',''));
    IBDatabase1.Params.Add('password='+ReadString('BD', 'Pwd',''));
    try
      IBDatabase1.Open;
    except
      on E: Exception do
      begin
        MessageDlg(E.Message,mtError,[mbOk],0);
        Application.Terminate
      end
    end
  finally
    Free
  end
end;

procedure TDataModule2.DataModuleCreate(Sender: TObject);
begin
  PostMessage(WM_AFTER_CREATE, 0, 0, 0)
end;

...

end.

Saludos.

angel.sosa 22-11-2012 19:40:26

gracias a todos ya funciono, incluso en red.
El error que tenia era en las variables, tenia mal la parte De, ya con eso pude compilar.

Código Delphi [-]
    IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'BDatos.ini');
 BasedeDatos := IniFile.ReadString('DB','PATH','');
   If BasedeDatos = '' then
    ShowMessage('Error al cargar Base de Datos') else
   Begin
    Try
     IBDatabase1.DatabaseName := BaseDeDatos;
      IBDatabase1.Connected := True;
      IBTransaction1.Active := True;
      ShowMessage('CONEXION CORRECTA');
    Except
      ShowMessage('No se puede conectar el servidor...');
    End;
   End;

voy a continuar con mi pratica para mas a delante hacer un manualito de esto y compartilo. claro con el proyectito.

GRAX ANY WAY.

Casimiro Notevi 22-11-2012 20:09:49

Cita:

Empezado por angel.sosa (Mensaje 450200)
gracias a todos ya funciono, incluso en red.
El error que tenia era en las variables, tenia mal la parte De, ya con eso pude compilar.

¿Y cuál es la parte De? :confused:

angel.sosa 23-11-2012 16:18:02

a la hora de asigar el path del ini al componente tenia el nombre mal escrito.

Código Delphi [-]
IBDatabase1.DatabaseName := BaseDeDatos;

Casimiro Notevi 23-11-2012 16:56:16

ah, ya veo :)


La franja horaria es GMT +2. Ahora son las 18:20:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi