Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Como Tratar Excepciones En Delphi Al Ejecutar Sentencia Sql (https://www.clubdelphi.com/foros/showthread.php?t=74201)

manuFP 05-06-2011 16:19:36

Como Tratar Excepciones En Delphi Al Ejecutar Sentencia Sql
 
Hola a todos.

Primero me presento, soy Manuel y esta es la primera vez que escribo por aquí.

He intentado buscar algo referente a ésto en los distintos foros y no he sido capaz de encontrar nada.

Si no supe buscar bien pido disculpas y os ruego ayuda agradeciéndoos de antemano.

Tengo un objeto memo en un formulario, a través del cuál escribo las sentencias sql que cargo en la propiedad correspondiente de un query, lo que quiero es que cuando introduzca algún dato en la consulta con errores de escritura en la frase sql, que no me corte el programa y tenga que volverlo a ejecutar escribiendo de nuevo toda la frase sql.

Supongo que eso se hace con manejo de excepciones?

el caso es que lo he intentado aplicar y no hay forma humana de que me funcione.

El trozo concreto de código es el siguiente:
Código Delphi [-]
 
...
  try
    dmquerys.Query1.ExecSQL;
  except
      on E:Exception do
      begin
        SHOWMESSAGE('Fallo en Sentencia SQL');
        DMQUERYS.Query1.SQL.Clear;
        DMQUERYS.QUERY1.SQL.Add('SELECT * FROM [tabla]');
      end;
  END;
  DMQUERYS.QUERY1.Open;
....
cuando me equivoco en la sentencia sql (en tiempo de ejecución), nada más llegar a la línea que hay a continuación de la sentencia try me dispara en error de EDBEngineerror......

¿Hay alguna manera de solucionarlo de forma que no se corte la ejecución del programa y que pueda sacar el típico mensaje "Error en sentencia sql" o algo similar?

Muchas Gracias.
Manuel.

ecfisa 06-06-2011 00:29:15

Hola manuFP y bienvenido a los foros del Club Delphi.:)

Tenés que utilizar el objeto EDBEngineError para poder extraer el código de error y actuar en consecuencia.
Un ejemplo:
Código Delphi [-]
  Query1.SQL.Text:= 'SELECT a* FROM COUNTRY';
  try
   Query1.Open;
  except
    on E: Exception do
     if E is EDBEngineError then  // Error de base de datos
     begin
       case EDBEngineError(E).Errors[0].ErrorCode of
         $2A12:begin// Invalid use of keyword
                 ShowMessage('Error en sentencia SQL'); //<- Error que arroja la sentencia de arriba
                 ...
               end;
          //...
         else ShowMessage(EDBEngineError(E).Errors[0].Message);
       end;
     end
     else ShowMessage(E.Message);
  end;
El tema es extenso para tratarlo en un mensaje con un simple ejemplo y los problemas que acarrea no capturar un error son serios. Te recomiendo
que amplies buscando sobre el tratamiento de errorres, objeto EDBEngineError, BDE Error codes, etc.
Y si quisieras ir un paso más allá y personalizar tus excepciones, Delphi te permite redefinir el manejador de las mismas mediante el evento Application.OnException.

Sin ir más lejos en el FTP del Club tenés La Cara Oculta de Delphi 4 que dedica un capítulo a tratar el tema excepciones.


Saludos.

manuFP 23-07-2011 12:29:37

Muchas Gracias Ecfisa, he estado algo liado y no lo he podido probar en profundidad pero alguna vez que intenté ponerlo en práctica, creo recordar que aunque en el ejecutable final me funcionaba, cuando lo estoy probando en el entorno de programación y ejecuto el programa me da error, sin embargo después con el programa corriendo de manera independiente me funcionó correctamente.

No se si esto es normal.

Gracias de todas formas y miraré de cerciorarme al 100% y tenerte informado.

Saludos.


La franja horaria es GMT +2. Ahora son las 07:50:17.

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