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..