sql >> Base de Datos >  >> RDS >> Oracle

Error de tiempo de ejecución:-2147217887 (80040e21) El sistema no puede encontrar un texto de mensaje para el número de mensaje 0x80040e21 en el archivo de mensajes de OraOLEDB

Con tantos parámetros, el problema puede ser cualquiera un elemento que incluye el tipo de datos no coincidentes, la longitud de los datos, etc. Aquí es donde se debe ejercitar el arte conocido como depuración.

  1. Verifique cuidadosamente los tipos de datos de la tabla (T_SAP_ZSSTABL_NEW ). Oracle puede tener tipos de datos que no se pueden traducir inmediatamente toby Tipos ADO como BLOB , CLOB , BFILE , tipos numéricos de alta precisión, tipos de caracteres máximos o tipos de extensión (XML, multimedia, etc.).

  2. Intente ampliar la longitud de los datos (o déjelo en blanco en la asignación de parámetros):

    Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR)
    
    Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
    

    Si es necesario, verifique las longitudes variables con Len() de VBA para generar una advertencia de usuario antes de agregar parámetros.

  3. Intenta ejecutar SELECT versión de consulta con los mismos parámetros para devolver una sola fila de resultados. Si ocurre el mismo error, comience con el primer parámetro, luego agregue un segundo o un lote de 10 secuencialmente para aislar el elemento problemático.

    SELECT ? AS TSZ_CHARG_PARAM, ? AS TSZ_MATNR_PARAM, ? AS TSZ_MAKTX_PARAM,
           ...
    FROM T_SAP_ZSSTABL_NEW
    WHERE TSZ_VBELN = ? AND TSZ_POSNR = ?
    
  4. Refactorice el código para mantener la coherencia, ya que es posible que haya perdido uno o desalineado, lo que puede ocurrir con muchas líneas repetitivas. Siempre apunte al código DRY (Don't Repeat Yourself). Una opción es usar un diccionario con pares clave/valor en lugar de más de 160 variables o rangos con nombre:

    Dim key As Variant
    Dim paramDict As Object
    Set paramDict = CreateObject("Scripting.Dictionary")
    
    For ...
        paramDict.Add "KeyX", "ValueX"
    Next ...
    
    ...
    
    With cmd
      .ActiveConnection = myOracleConn
      .CommandText = strSQL
      .CommandType = adCmdText
    
      For Each key In  paramDict.Keys
         .Parameters.Append .CreateParameter(key, adVarChar, adParamInput, , paramDict(key))
      Next key
    
      .Execute
    End With
    

    Si tiene tipos mixtos, intente crear diferentes diccionarios para cada tipo e itérelos en secuencia para agregar parámetros. Y ajuste UPDATE con todos los mismos tipos cerca uno del otro. Recuperar UPDATE no necesita seguir el orden de las columnas en la definición de la tabla.

  5. Si es posible (o una solución a largo plazo), considere rediseñar la tabla de formato ancho de TSZ columnas en una forma normalizada de formato largo.

    ID   POSNR   VBELN   Indicator   Value
     #     XXX     XXX       CHARG     XXX
     #     XXX     XXX       MATNR     XXX
     #     XXX     XXX       MAKTX     XXX
    ...
    

    Aunque esto agregará 167 filas para cada identificador único, en el diseño de la base de datos, las filas son mucho más baratas que las columnas y, por lo tanto, las consultas serán más fáciles, el almacenamiento de datos más escalable y el mantenimiento más eficiente. Por ejemplo, una nueva métrica no necesita una nueva columna definida con toda la metainformación, sino simplemente una nueva fila. Y con el PIVOT de Oracle puede volver a renderizar fácilmente el formato ancho.

En general, no existe una forma única y clara de depurar un error de tiempo de ejecución como este derivado de una extensión API como la conexión a la base de datos. La sintaxis SQL o la referencia a objetos VBA se pueden manejar fácilmente, pero los problemas específicos de datos requieren una exploración creativa a través del proceso general.