Capturar Errores de ODBC
Una solución para leer los mensajes generados desde el Servidor

 

Fecha : 08/Abr/1998 (publicado el 9/Abr/98)
Autores: Christian Isla V.
cisla@ctr.cl
Mauricio Díaz A.
mdiaz@werken.ufro.cl



¿Has creado aplicaciones cliente VB con ODBC?
Pues esto te puede ser de mucha utilidad.


Crear aplicaciones clientes que accesen datos desde un servidor de BD es una tarea agradable,
pero a la vez desagradable. Bueno, la verdad es que lo primero que uno piensa es :
"Construyendo una BD sólida (con reglas, triggers, validación por llave foránea, etc) y, por otro
lado, construyendo aplicaciones inteligentes, tenemos todos nuestros problemas resueltos".
Bueno, esto se cumple en plenitud (considerando que todos somos profesionales de primer nivel),
hasta que aparece por primera vez el famoso mensaje de error (y que posteriormente, se
convertirá en nuestro karma) : " 3146 ‘ODBC failure’ ". Lo primero que piensas es : "Oh!, algo
ocurrió con el ODBC", pero no sabes qué es. El siguiente paso es reconstruir la instrucción que se
está enviado al servidor y, si aparentemente no tiene errores de sintaxis, se ejecuta a sangre fría
directamente en el servidor para saber de qué se trata el error.
Fácilmente podemos concluir que esta no es la mejor manera de resolver un problema de este
tipo. Sobre todo si el problema no está en la aplicación (hablamos de aplicaciones inteligentes) y,
a veces tampoco está en la BD. Entonces nuestro problema se reduce a una sola pregunta : ¿Cómo puedo
capturar, en la aplicación, los mensajes generados desde el servidor?.
Pues, esta es la solución :

"Los mensajes que el servidor envía a la aplicación, no se pierden en el limbo. El DBEngine
(Motor de BD propio de VB) los guarda como una lista de errores. Y el último error es el 3146 que
es el que se traspasa al objeto Err y que posteriormente se muestra en una ventana.".


Para hacerte más gráfica la solución, te presento unas líneas de código que puedes probar :


' 	Este código lo puedes ubicar al final de tu rutina,

' pero te recomiendo que lo optimices y lo definas como

' una rutina global.

'	Supongamos que estamos en una rutina que va a realizar

' alguna operación sobre los datos de una BD en un servidor.



On Error GoTo ManejaError



...

...

...



ManejaError :



  If Err.Number <> 3146 Then ' El famoso error "ODBC failure"

     MsgBox Err.Description, 16, "Error del Programa"

  Else

     Dim Contador As Integer



     ' Recorremos la lista de errores

     For Contador = 0 To DBEngine.Errors.Count - 1

       'Como el error famoso también está en esta lista, preguntamos ...

       If DBEngine.Errors(Contador).Number <> 3146 Then

          MsgBox DBEngine.Errors(Contador).Description, 16, "Error del Servidor"

       End If

     Next Contador

  End If

On Error GoTo 0



End Sub


En mi caso, desarrollamos (soy parte de un equipo de desarrollo) aplicaciones VB que se comunican
con un servidor de BD Sybase. Y los mensajes que llegan desde el servidor, y que se leen en la aplicación,
llevan el siguiente prefijo : "[INTERSOLV][ODBC SQL Server driver][SQL Server]". Así es que hemos
mejorado este código para eliminar, del mensaje final, este prefijo.
Si tu trabajas con otro motor de BD distinto de Sybase (SQL Server, Oracle, etc), este código
también te sirve y, aunque no lo he comprobado aún, debería servir para cualquier aplicación que
utilice ODBC para comunicarse con alguna BD.

Esta colaboración fue escrita por
Mauricio Díaz A., pero no puedo dejar de mencionar que esta
solución fue un trabajo conjunto con
Christian Isla V..


ir al índice