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)
-   -   Excepción EOleException, Mysql has gone away... (https://www.clubdelphi.com/foros/showthread.php?t=44884)

JerS 17-06-2007 03:03:24

Excepción EOleException, Mysql has gone away...
 
Amigos les voy a pegar el siguiente codigo sencillo para ver si me entienden:

Código Delphi [-]
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    ADOConnection1: TADOConnection;
    ADODataSet1: TADODataSet;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
ADODataSet1.Close;
ADODataSet1.CommandText:=('SELECT curtime()');
ADODataSet1.Open;
label1.Caption:=ADODataSet1.Recordset.Fields.Item[0].value;
end;

end.


por lo que pueden ve es un simple Ttimer con una opcion de que cada segundo me verifique la hora con una sentencia SQL, ok todo funciona muy bien hasta que paro el servicio de Mysql, es normal que me aparezca la siguiente Exception: " EOleException, Mysql has gone away".. perfecto, ahora yo voy y reactivo el sercvicio de mysql, cuando la aplicacion intenta hacer su consulta mysql ya con el servicio corriendo me sigue dando la exception. Para que pueda reconectar debo cerrar la aplicacion y volverla abrir... ahora mi pregunta es la siguiente, hay alguna forma de volver a conectar a la base de dato sin tener que reiniciar mi aplicación.

Slash 17-06-2007 03:57:11

Si, debes revisar el estado en el que queda tu conexion y volver a abrirla. Tambien podes usar un try except y ante el error voler a abrirla. Esto debería solucionar el problema, espero que funcione.

Saludos.

rruz 17-06-2007 04:28:58

intenta esto

Código Delphi [-]
procedure TForm1.Timer1Timer(Sender: TObject);
begin
      try
        if not ADOConnection1.Connected then
        ADOConnection1.Connected:=True;
        ADODataSet1.Close;
        ADODataSet1.CommandText:=('SELECT curtime()');
        ADODataSet1.Open;
        label1.Caption:=ADODataSet1.Recordset.Fields.Item[0].value;
      except on e : exception do
        //ShowMessage(e.Message);
      end;
end;

Saludos

JerS 17-06-2007 05:16:33

si yo puedo tranquilamente capturar la exception con un try pero lo que no se es que hacer para que vuelva a conectar a la base de dato Ejm:

Código Delphi [-]
sw:=false;
try
ADODataSet1.Close;
ADODataSet1.CommandText:=('SELECT curtime()');
ADODataSet1.Open;
label1.Caption:=ADODataSet1.Recordset.Fields.Item[0].value;exception
on EOleException Do
sw:=true;
End;
if sw=false Then
adoconnection1.connected:=true;

ok capturo la exception e intento conectar de nuevo mi coneccion pero es inutil, sigue mostrando el error que les comente...
Recuerden que la idea es retomar la coneccion como si nada ubiece pasado, que el usuario nisiquiera se alla dado cuenta que el servicio de mysql se cayo

Slash 17-06-2007 21:46:36

Cita:

Empezado por rruz
Código Delphi [-]
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if not ADOConnection1.Connected then
begin
ADOConnection1.Connected:=True;
ADODataSet1.Close;
ADODataSet1.CommandText:=('SELECT curtime()');
ADODataSet1.Open;
label1.Caption:=ADODataSet1.Recordset.Fields.Item[0].value;
end else
begin
ADOConnection1.Open
end;
end;

Con esto debería funcionar, fijate donde pones el "ADOConnection1.Open".
Podes usarlo en la excepción en vez de en el else. Además como lo tenes en un timer cuando se levante la DB se va a volver a conectar sin problemas. Si queres, para que no te salga el cartel de error podes poner todo el bloque en una excepcion y si no se conecta no haces nada, total volves a intentar cuando se ejecute el timer.
Saludos y cualquier duda prgunta tranquilo.

JerS 18-06-2007 00:56:29

Cita:

Empezado por Slash
Con esto debería funcionar, fijate donde pones el "ADOConnection1.Open".
Podes usarlo en la excepción en vez de en el else. Además como lo tenes en un timer cuando se levante la DB se va a volver a conectar sin problemas. Si queres, para que no te salga el cartel de error podes poner todo el bloque en una excepcion y si no se conecta no haces nada, total volves a intentar cuando se ejecute el timer.
Saludos y cualquier duda prgunta tranquilo.

amigo, le coloco la opcion de Adoconnection1.open pero nada me sigue apareciendo la excepcion, y me fijo en el debuger y adoconnection1.connected es igual a true, de verdad nose que esta pasando

Slash 18-06-2007 20:41:05

No puede ser que nos gane una conexión. Proba lo siguiente, en vez de preguntar por Connected pregunta por la propiedad State. Los posibles valores son:

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.

Con esto vamos a saber el estado específico de la conexion de todos modos no entiendo porque Connected sigue en true. Proba preguntanto por State (para ver en que estado esta quedando la conexion) y despues probá en el except cerrar y abrir la conexión (ejecuta un close y luego un open).
Saludos y seguí posteando que ya lo vamos a resolver.

JerS 19-06-2007 02:22:05

Cita:

Empezado por Slash
No puede ser que nos gane una conexión. Proba lo siguiente, en vez de preguntar por Connected pregunta por la propiedad State. Los posibles valores son:

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.

Con esto vamos a saber el estado específico de la conexion de todos modos no entiendo porque Connected sigue en true. Proba preguntanto por State (para ver en que estado esta quedando la conexion) y despues probá en el except cerrar y abrir la conexión (ejecuta un close y luego un open).
Saludos y seguí posteando que ya lo vamos a resolver.


Amigo Slash, el state siempre me retorna StOpen, de verdad me tiene :mad:, se muestra como si estubiece conectado pero me sigue dando el problema de la excepcion

Slash 19-06-2007 04:19:04

mmm... :mad: que rabia... te pido, por favor, me pases el numero de error. Voy a averiguar por otro lado a ver si alguien nos puede ayurar. Mientras proba, cuando te de el error, cerrar primero la conexion y despues volverla a abrir a ver que pasa.
Voy a reproducir el codigo a ver si puedo generar el error.

JerS 21-06-2007 00:08:59

Cita:

Empezado por Slash
mmm... :mad: que rabia... te pido, por favor, me pases el numero de error. Voy a averiguar por otro lado a ver si alguien nos puede ayurar. Mientras proba, cuando te de el error, cerrar primero la conexion y despues volverla a abrir a ver que pasa.
Voy a reproducir el codigo a ver si puedo generar el error.

Amigo Slash ... no he podido dar con el error, pero bueno estoy dejando para despues dicho error :S


La franja horaria es GMT +2. Ahora son las 15:19:22.

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