sql >> Databasteknik >  >> RDS >> Oracle

Run Time error:-2147217887(80040e21) Systemet kan inte hitta en meddelandetext för meddelandenumret 0x80040e21 i meddelandefilen för OraOLEDB

Med så många parametrar kan problemet vara vilket som helst ett objekt inklusive felaktig datatyp, datalängd etc. Här måste tekniken som kallas felsökning utövas.

  1. Kontrollera noggrant datatyperna för tabeller (T_SAP_ZSSTABL_NEW ). Oracle kan ha datatyper som inte omedelbart kan översättas av ADO-typer som BLOB , CLOB , BFILE , numeriska typer med hög precision, maximala teckentyper eller tilläggstyper (XML, media, etc.).

  2. Prova att utöka datalängder (eller lämna tomt i parametertilldelning):

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

    Om det behövs, kontrollera variabla längder med VBA:s Len() för att höja en användarvarning innan parametrar läggs till.

  3. Prova att köra SELECT version av frågan med samma parametrar för att returnera en enda rad med resultat. Om samma fel inträffar, börja med första parametern och lägg sedan till en andra eller sats om 10 i följd för att isolera det problematiska objektet.

    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. Refaktorera kod för konsistens, eftersom du kanske har missat en eller felinriktad en som kan uppstå med många repetitiva rader. Sikta alltid på DRY (Don't Repeat Yourself) kod. Ett alternativ är att använda en ordbok med nyckel/värdepar istället för 160+ variabler eller namngivna intervall:

    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
    

    Om du har blandade typer, försök att skapa olika ordböcker för varje typ och iterera dem i sekvens för att lägga till parametrar. Och justera UPDATE med alla samma typer nära varandra. Återkalla UPDATE behöver inte följa kolumnernas ordning i tabelldefinitionen.

  5. Om möjligt (eller långsiktig lösning), överväg att omforma bredformatstabellen för TSZ kolumner till en normaliserad form av långt format.

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

    Även om detta kommer att lägga till 167 rader för varje unik identifierare, är rader i databasdesign mycket billigare än kolumner, vilket gör att förfrågningar blir enklare och datalagringen mer skalbar och underhållet mer effektivt. Till exempel behöver ett nytt mått inte en ny definierad kolumn med all metainformation utan bara en ny rad. Och med Oracles PIVOT du kan enkelt återrendera bredformatet.

Sammantaget finns det inget enkelt, tydligt sätt att felsöka ett runtime-fel som detta från ett API-tillägg som databasanslutning. SQL-syntax eller VBA-objektreferenser kan enkelt hanteras men dataspecifika problem kräver att man kreativt gräver igenom den övergripande processen.



  1. Välj översta raderna tills värdet i den specifika kolumnen har visats två gånger

  2. använder Google Dokument som en databas?

  3. Kan jag använda kommandot \copy till en funktion av postgresql?

  4. MySQL Group efter datum mellan