Cómo obtener acceso a información adicional sobre los errores que se devuelven al usar los procedimientos almacenados del sistema de automatización OLE


Resumen


Los procedimientos almacenados de automatización OLE necesitan acceso no restringido a los objetos que desean invocar para funcionar correctamente. Normalmente, se pueden ver los siguientes errores cuando se producen problemas sin resolver con el objeto de destino:
Técnico [Controlador ODBC SQL Server] Error de protocolo en la secuencia TDS [Microsoft] [controlador ODBC SQL Server] error de la secuencia de funciones

Más información


Cuando esto sucede, es posible que se produzcan varios problemas subyacentes al mismo tiempo. Principalmente, el error de flujo de datos tabular (TDS) es para la mayoría de los errores genéricos y, a menos que también esté tratando una implementación de servicio de datos remoto (RDS), esto no será un puntero muy claro al origen del problema. Para aumentar la información de error que se devuelve, debe reemplazar la llamada de sp_oageterrorinfo con una llamada a sp_displayoaerrorinfo. Para obtener acceso a esta información adicional, primero debe compilar los dos procedimientos almacenados bastante cómodos que se mencionan en el siguiente artículo de libros en línea de SQL Server 7,0:
   OLE Automation Return Codes and Error Information 
El artículo también explica detalladamente por qué estos procedimientos almacenados son necesarios para extraer información adicional que se pueda usar, que no se trata en este artículo. Una vez compilados los procedimientos almacenados, los errores anteriores le proporcionarán información mucho más útil, como se muestra en el siguiente fragmento de código que usa el control de errores modificado para darnos un resultado mucho más interesante:
DECLARE @object intDECLARE @hr intEXEC @hr = sp_OACreate 'Nic.cls', @object OUTPUTIF @hr <> 0BEGIN    EXEC sp_displayoaerrorinfo @object, @hr--  EXEC sp_OAGetErrorInfo @object    RETURNEND
Lo que obtenemos con la llamada de sp_displayoaerrorinfo habilitada en esta instancia es similar a la siguiente:
Información de error de automatización OLE HRESULT: 0x800401f3 origen: ODSOLE procedimiento extendido Descripción: cadena de clase no válida
En este ejemplo, vemos que el error "cadena de clase no válida" puede indicar que el ProgID o el CLSID (NIC. CLS del ejemplo anterior) indicados en la llamada de sp_oacreate no se ha registrado correctamente como un objeto OLE en SQL Server. En nuestro ejemplo, esto es lo que sucede porque NIC. CLS es un objeto ficticio. Para obtener más información sobre estos tipos de errores, eche un vistazo a la documentación de la llamada sp_oaGetErrorInfo en el orden de Online.In de los libros de SQL Server para ver un poco más de lo que sucede aquí, agregue "Select @hr" entre las instrucciones IF y BEGIN del código, como por ejemplo:
DECLARE @oFTP intDECLARE @hr int  DECLARE @vvar varchar(255)DECLARE @vout intEXEC @hr = sp_OACreate 'Nic.Inet', @object OUTPUTSELECT @hrIF @hr <> 0BEGIN    EXEC sp_displayoaerrorinfo @object, @hr--   EXEC sp_OAGetErrorInfo @object    RETURNEND
Esto devuelve la siguiente información de error como Enabled anteriormente:
------------2147221005(1 row(s) affected) 
Información de error de automatización OLE HRESULT: 0x800401f3 origen: ODSOLE procedimiento extendido Descripción: cadena de clase no válida
Debe tenerse en cuenta que puede resultar tentador agregar una @hr a la llamada a EXEC sp_OAGetErrorInfo @object, que si se intenta realmente devolverá un error falso en un resultado "comando completado correctamente". Sin embargo, esto no es lo que queremos, porque necesitamos saber por qué estamos recibiendo un resultado distinto de cero para @hr en el código.Nota Si está usando Microsoft SQL Server 2005, es posible que tenga que cambiar ligeramente este código. Para obtener más información, consulte el tema "códigos de retorno e información de error de automatización OLE" en los libros en línea de SQL Server 2005.