PDA

Ver la Versión Completa : Consultar conexión del Servidor


BlueSteel
25-08-2007, 03:11:24
Hola...

Quiero agregar una sentencia a mi programa (pero aún no se como hacerlo)...

de partida informo que es con Interbase.... y que la base de dato esta remota y tambien local

Lo que necesito hacer es que cuando se inicie el programa consulte si la base de datos esta ok.. de lo contrario (si no se puede conectar), me diga que no se pudo conectar (y que no se caiga el sistema) y mande a un form de configuración de base de dato (que lo tengo listo), para examinar la base y poder conectarla...

Mi otra duda es, cuando tomo el nombre de la base de datos.. me aparece en él la ruta completa.. (ruta_servidor+directorio+base)...

como obtengo si la conexión es remota.. o local ???

bueno..eso seria por el momento:p

Hugo
25-08-2007, 12:07:00
Para conectar una base de datos local usa:
'C:\Datos\Basededatos.gdb'
Para conectar en un servidor:
'Servidor:C:\Datos\Basededatos.gdb'

Para comprobar que la base de datos está en su sitio sin que el programa de errores, debes asegurarte de comprobar su existencia antes de abrirla, por ejemplo en el evento BeforeOpen de la base de datos.

Espero que te sirva de ayuda.
Saludos.

ArdiIIa
25-08-2007, 13:04:22
Hola BlueSteel



With IbDataBase1 DO
Begin
Close;
DataBaseName := PATH_DATABASE;
Params.Values['user_name'] := USER_PARAM;
Params.Values['password'] := PASSWORD_PARAM;
Open;
Aviso('CONEXION SATISFACTORIA');
End;


El procedimiento sería algo parecido a lo anterior.
Antes de conectar, puedes tomar esos datos bien suministrador por el usuario o guardados en un INI.

Evidentemente si la conexión falla se poducirá una exception que tú deberías controlar tomando los pasos adecuados, por ejemplo, que el usuario introduzca nuevamente los datos o aquella que consideres mas adecuada.

En cuanto a la conexión remota, yo habitualmente utilizo la IP del servidor mas la ruta de la Base de datos.

198.119.0.1:c:\programa\xxxxx

BlueSteel
28-08-2007, 21:46:42
Bueno... retomando este tema para configurar el lugar de la base de datos, me decidí a realizar la creación de archivos .ini y allí almacenar la configuración, para eso realice los sgtes procesos


1. al Iniciar el Sistema (Menu), ejecuto en el evento onCreate el sgte código

procedure TMenu.FormCreate(Sender: TObject);
Var
Parametro:Tinifile;
begin
If not DirectoryExists('D:\Sistemas\Propint') Then
Begin
{$I-}
MkDir('D:\Sistemas\Propint');
End;
if FileExists('D:\Sistemas\Propint\config.ini') Then
Begin
Parametro := TiniFile.Create('D:\Sistemas\Propint\config.ini');
Datos.IBD_Compras.Connected := False;
Datos.IBD_Compras.DatabaseName := Parametro.ReadString('BaseDato','Servidor',' ');
Datos.IBD_Compras.Params.Values ['user_name'] := Parametro.ReadString('BaseDato','Usuario',' ');
Datos.IBD_Compras.Params.Values ['password'] := Parametro.ReadString('BaseDato','Clave',' ');
Datos.IBD_Compras.Connected := True;
Parametro.Free;
End
Else
Begin
ShowMessage('Debe Seleccionar Base de Datos para continuar');
Man_Datos := TMan_Datos.Create(Self);
Try
Man_Datos.ShowModal;
Finally
Man_Datos.Free;
End;
End;
End;


2.- Si no existe el archivo config.ini, llama al formulario Man_Datos, en en cual, en el evento onActive, ejecuto lo sgte


procedure TMan_Datos.FormActivate(Sender: TObject);
Var
Parametro:Tinifile;
Begin
if FileExists('D:\Sistemas\Propint\config.ini') Then
Begin
Parametro := TiniFile.Create('D:\Sistemas\Propint_1\config.ini');
vBas.Text := Parametro.ReadString('BaseDato','Servidor',' ');
vUsu.Text := Parametro.ReadString('BaseDato','Usuario',' ');
vPas.Text := Parametro.ReadString('BaseDato','Clave',' ');
Parametro.Free;
End
Else
ShowMessage('Debe Seleccionar Base de Datos para continuar');
end;

Si no existe el archivo, se deberá ingresar los datos que pide el Formulario para conectar a la base de datos.

los datos a pedir son
vBas.Text -> Ubicación del Servidor + nombre de la base
vUsu.Text -> Usuario
vPas.Text -> clave de usuario

una vez ingresado los datos, los almaceno en un archivo .ini, y conecto a la base de datos de la sgte forma

procedure TMan_Datos.SpeedButton1Click(Sender: TObject);
var
Nombre_Base : String;
Parametro:Tinifile;
begin
if sLocal.Checked = True Then
Nombre_Base := vBas.Text
else
Nombre_Base := Concat('\\',vSer.Text,'\',vBas.Text);
Datos.IBD_Compras.Connected := False;
Datos.IBD_Compras.LoginPrompt := False;
Datos.IBD_Compras.DatabaseName := Nombre_Base;
Datos.IBD_Compras.Params.Values ['user_name'] := vUsu.Text;
Datos.IBD_Compras.Params.Values ['password'] := vPas.Text;

Parametro := TiniFile.Create('D:\Sistemas\Propint\config.ini');
Parametro.WriteString('BaseDato','Servidor',Datos.IBD_Compras.DatabaseName);
Parametro.WriteString('BaseDato','Usuario',Datos.IBD_Compras.Params.Values ['user_name']);
Parametro.WriteString('BaseDato','Clave',Datos.IBD_Compras.Params.Values ['password']);
Parametro.Free;
Datos.IBD_Compras.Connected := True;
end;


bueno, y hasta el momento me funciona bien,,, dentro de la semana lo probaré en donde tengo k instalar el sistema...:p

solo me queda por agregar que:

Datos -> Formulario de tipo DataModule
IBD_Compras -> DataBase
Man_Datos -> Formulario conexión a base de dato

BlueSteel
28-08-2007, 22:06:42
revisando este tema... lo único que me falta es realizar un Test de conexión.. y si falla que no almacene nada

alguien sabe como realizarlo??

maeyanes
28-08-2007, 22:11:18
Prueba con algo como:


function CanConnect(Database: TIBDatabase): Boolean;
begin
try
Database.Connect;
Result := True;
Database.Disconnect
except
Result := False
end
end;


No especificas que componentes usas para conectarte, así que puse el ejemplo con los IBX...



Saludos...

BlueSteel
28-08-2007, 22:20:40
Prueba con algo como:
Código Delphi [-] (http://www.clubdelphi.com/foros/#)
function CanConnect(Database: TIBDatabase): Boolean;
begin
try
Database.Connect;
Result := True;
Database.Disconnect
except
Result := False
end
end;
No especificas que componentes usas para conectarte, así que puse el ejemplo con los IBX...


Saludos...

Sorry.. los estoy realizando con los IBX...
tube los sgtes problemas...

peres Database.Connected
perro el Disconnect no funca...

ahora, igual encontre la sgte fucción...

Database.TestConnected

y la realizo de la sgte forma... claro que con mas código...:D

If Datos.IBD_Compras.TestConnected = True Then ShowMessage('Funciona Ok');



maeyanes, igual gracias.. me alumbrastes la ampolleta...

maeyanes
28-08-2007, 22:26:15
Hola!

Disculpa, no recordaba que las IBX no tienen los métodos Connect y Disconnect, si no la propiedad Connected.

Y bueno, la forma que usas en realidad es menos código...


if Datos.IBD_Compras.TestConnected then
// Guardas los datos


P.D. Por cierto, para comparar los valores de verdad de una variable, método o propiedad Boolean, no es necesario compararlo con el valor, si quieres saber si es verdadero basta con hacerlo como te puse en el ejemplo, para saber si es falso, solo tienes que hacer:


if not Datos.IBD_Compras.TestConnected then
ShowMessage('Error conectando a la base de datos');




Saludos...

BlueSteel
28-08-2007, 22:44:30
gracias por el concejo....

bueno, ahora tengo la sgte duda...para realizar el test de conección,, deberá estar conectada la base.. por lo pronto lo tengo así..


Datos.IBD_Compras.Connected := False;
Datos.IBD_Compras.LoginPrompt := False;
Datos.IBD_Compras.DatabaseName := Nombre_Base;
Datos.IBD_Compras.Params.Values ['user_name'] := vUsu.Text;
Datos.IBD_Compras.Params.Values ['password'] := vPas.Text;
Datos.IBD_Compras.Connected := True;

If Datos.IBD_Compras.TestConnected Then
Begin
Parametro := TiniFile.Create('D:\Sistemas\Propint\config.ini');
Parametro.WriteString('BaseDato','Servidor',Datos.IBD_Compras.DatabaseName);
Parametro.WriteString('BaseDato','Usuario',Datos.IBD_Compras.Params.Values ['user_name']);
Parametro.WriteString('BaseDato','Clave',Datos.IBD_Compras.Params.Values ['password']);
Parametro.Free;
End
Else
ShowMessage('Error de conexión, ingrese ruta nuevamente');


ya que me da el sgte error

I/O error for file "ruta..del...archivo"
Error while trying to open file
unknown Win32 error 2

y si pongo Datos.IBD_Compras.Connected := True;, despues de la consulta del test.. siempre me indica que existe un error de conexión...

mmmm:p:confused:..seguire intentando

ArdiIIa
28-08-2007, 22:51:26
Hola BlueSteel.

Vuelvo a insistir. Tal como te lo planteé en el primer mensaje, es muy adecuado para hacer el test. Si salta la exception, ya sabes que falló.

En cuanto al error que se te produce, comprueba la ruta de la BD y que esta no tenga los atributos de solo lectura. (por ejemplo si la copiaste desde un CD).

Saludos

maeyanes
28-08-2007, 22:52:17
mmm... entonces TestConnected no prueba si se puede conectar o no a la base de datos, solo checa si la base de datos ya está conectada... en dado caso prueba así:


try
Datos.IBD_Compras.Connected := True;
// Guardar los datos de conexión en el .ini...
except
ShowMessage('Ocurrió un error al intentar conectar con la base de datos')
end


El uso que se le podría dar a TestConnected sería:


// Verificamos que la aplicación esté conectada a la base de datos
if not Database.TestConnected then
Database.Connected := True;
// Realizo las tareas necesarias




Saludos...