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)
-   -   Chequear conexion a sql (https://www.clubdelphi.com/foros/showthread.php?t=74281)

antigrondona 09-06-2011 14:32:34

Chequear conexion a sql
 
Hola amigos, simplemente necesito verificar la conexion a la base de datos para evitar errores al iniciar la aplicacion. Se me ocurre que la propiedad state del ado puede darme esta informacion pero no sé qué valores asume.
Gracias.

Caro 09-06-2011 15:23:09

Hola antigrondona, la propiedad State puede tomar estos valores:

Código:

stClosed -> Connection object is inactive and not connected to a database.
stOpen -> Connection object is inactive, but connected to a database.
stConnecting -> Connection object is in the process of connecting to a database.
stExecuting -> Connection object is currently executing.
stFetching -> Connection object is retrieving data from the database

Sacado de la ayuda.

Saluditos

antigrondona 09-06-2011 15:27:00

Estaba justo leyendo eso en la ayuda, pero al invocar esas prop, me da error de incompatibilidad.
ado.state:=stopened, me da ese error.

Neftali [Germán.Estévez] 09-06-2011 15:34:19

Yo creo que al hacer el Open (que debes hacerlo igualmente para luego consultar el estado) ya puedes obtener si no tienes conexión. En ese caso ya puedes devolver el error.

Otra cosa, es cuando ya hayas realizado el Open inicial, consultar a posteriori si la conexión sigue abierta o se ha perdido; Pero tal como dices, al iniciar la aplicación, te debería bastar con capturar los errores del Open/Connect.

Caro 09-06-2011 15:38:20

Cita:

Empezado por antigrondona (Mensaje 403130)
Estaba justo leyendo eso en la ayuda, pero al invocar esas prop, me da error de incompatibilidad.
ado.state:=stopened, me da ese error.

No puedes asignar un valor a esa propiedad (es de solo lectura), solo puedes ver que valores toma en un cierto momento

Código Delphi [-]
 If ado.state = [stClosed] then
  ...............................

Saluditos

antigrondona 09-06-2011 15:38:29

Cita:

Empezado por Neftali (Mensaje 403135)
Yo creo que al hacer el Open (que debes hacerlo igualmente para luego consultar el estado) ya puedes obtener si no tienes conexión. En ese caso ya puedes devolver el error.

Otra cosa, es cuando ya hayas realizado el Open inicial, consultar a posteriori si la conexión sigue abierta o se ha perdido; Pero tal como dices, al iniciar la aplicación, te debería bastar con capturar los errores del Open/Connect.

Una vez indicada la cadena de conexion, cómo debería testear los errores?
por código por favor, si es posible.

antigrondona 09-06-2011 16:03:03

Cita:

Empezado por Caro (Mensaje 403137)
No puedes asignar un valor a esa propiedad (es de solo lectura), solo puedes ver que valores toma en un cierto momento

Código Delphi [-] If ado.state = [stClosed] then ...............................


Saluditos

Me habia equivocado, ahora me hace el chequeo pero sólo si está abierta la conexión. Si corto manualmente la conexión, me debería dar cerrado pero no lo hace, queda intentando la conexion hasta que finalmente aborta.

Neftali [Germán.Estévez] 09-06-2011 16:18:02

Si estás utilizando ADO, al hacer un Open, captura los errores que se generan.
Algo así:

Código Delphi [-]
try
   ADOConn.Open;
except
  on E:EOLEException do begin
    // error 
    MessageDlg(Format('Error: %s'+#13+#10+'Código: %d',
      [E.Message, E.ErrorCode]), mtError, [mbOK], 0);
  end;
end;

Te lo pongo de memoria.

También puedes utilizar los eventos del TADOConnection. OnConnectComplete, OnWillConnect, AfterConnect.

Prueba a poner algun mensaje en ellos.

oesqueda 09-06-2011 16:30:15

Paso una funcion para que revises si esta conectado tu TADOConnection.

Código Delphi [-]
Function ConectarDB(var AMsg:string):boolean;
begin
try
  ADOConnection.CLOSE;
  ADOConnection.connectionstring = 'CADENA DE CONEXION';
  ADOConnection.OPEN;
  AMsg := '';
except
  on e: exception do
    AMsg := e.message;
end;

result := ADOConnection.Connected;
end;

Pasas la variable AMSG y ahi obtienes el mensaje en caso de no conectarse.

Caro 09-06-2011 16:32:07

Cita:

Empezado por antigrondona (Mensaje 403143)
Me habia equivocado, ahora me hace el chequeo pero sólo si está abierta la conexión. Si corto manualmente la conexión, me debería dar cerrado pero no lo hace, queda intentando la conexion hasta que finalmente aborta.

Acabo de hacer la prueba y al hacer esto:

Código Delphi [-]
  ADOConnection1.Connected := False;

y ver despues el state me lo pone en stClosed.

también puedes hacerlo como te indica Neftali.

Saluditos

antigrondona 09-06-2011 16:43:14

Cita:

Empezado por Neftali (Mensaje 403147)
Si estás utilizando ADO, al hacer un Open, captura los errores que se generan.
Algo así:

Código Delphi [-]try ADOConn.Open; except on E:EOLEException do begin // error MessageDlg(Format('Error: %s'+#13+#10+'Código: %d', [E.Message, E.ErrorCode]), mtError, [mbOK], 0); end; end;


Te lo pongo de memoria.

También puedes utilizar los eventos del TADOConnection. OnConnectComplete, OnWillConnect, AfterConnect.

Prueba a poner algun mensaje en ellos.

EOLEException me da error, identificador no declarado;

Neftali [Germán.Estévez] 09-06-2011 16:58:02

Cita:

Empezado por antigrondona (Mensaje 403154)
EOLEException me da error, identificador no declarado;

Pulsa F1 y la ayuda te dirá que debes añadir la unit ComObj.

antigrondona 09-06-2011 17:26:24

Muchas gracias, perfecto quedó.

oesqueda 09-06-2011 17:31:14

Y cual fue la definitiva? para que quede registrado para cualquiera que tenga esa duda y pueda resolver tambien su dilema

Saludos

antigrondona 09-06-2011 21:52:12

El código de Neftalí o la función que vos propusiste, las 2 me funcionaron.

BlueSteel 10-06-2011 00:05:05

Cita:

Empezado por oesqueda (Mensaje 403151)
Paso una funcion para que revises si esta conectado tu TADOConnection.

Código Delphi [-]Function ConectarDB(var AMsg:string):boolean; begin try ADOConnection.CLOSE; ADOConnection.connectionstring = 'CADENA DE CONEXION'; ADOConnection.OPEN; AMsg := ''; except on e: exception do AMsg := e.message; end; result := ADOConnection.Connected; end;


Pasas la variable AMSG y ahi obtienes el mensaje en caso de no conectarse.

Esta buena esta funciona... tambien me sirve...

Salu2:p:p:p

oesqueda 10-06-2011 00:28:58

Mi estimado bluesteel a tus ordenes ahí me agregas en los creditos o el huevo de pascua.
Jejejeje un saido


La franja horaria es GMT +2. Ahora son las 10:28:57.

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