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