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.
[email protected]
Mauricio D�az A.
[email protected]



�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