sql >> Database >  >> RDS >> Oracle

Runtime-fout:-2147217887(80040e21) Het systeem kan geen berichttekst vinden voor het berichtnummer 0x80040e21 in het berichtbestand voor OraOLEDB

Met zoveel parameters kan het probleem elk . zijn één item inclusief niet-overeenkomend gegevenstype, gegevenslengte, enz. Hier moet de kunst die bekend staat als debuggen worden uitgeoefend.

  1. Controleer zorgvuldig de gegevenstypen van de tabel (T_SAP_ZSSTABL_NEW ). Oracle kan datatypes hebben die niet onmiddellijk vertaald kunnen worden door ADO-typen zoals BLOB , CLOB , BFILE , zeer nauwkeurige numerieke typen, maximale tekentypen of extensietypen (XML, media, enz.).

  2. Probeer datalengtes uit te breiden (of laat leeg in parametertoewijzing):

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

    Controleer indien nodig variabele lengtes met VBA's Len() om een ​​gebruikerswaarschuwing te geven voordat parameters worden toegevoegd.

  3. Probeer de SELECT . uit te voeren versie van de query met dezelfde parameters om een ​​enkele rij met resultaten te retourneren. Als dezelfde fout optreedt, begin dan met de eerste parameter en voeg vervolgens een tweede of een batch van 10 achtereenvolgens toe om het problematische item te isoleren.

    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. Refactor code voor consistentie, omdat u er misschien een hebt gemist of verkeerd uitgelijnd, wat kan voorkomen bij veel herhalende regels. Streef altijd naar DRY (Don't Repeat Yourself) code. Een optie is om een ​​woordenboek met sleutel/waarde-paren in plaats van 160+ variabelen of benoemde bereiken:

    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
    

    Als je gemengde typen hebt, probeer dan voor elk type verschillende woordenboeken te maken en herhaal ze in volgorde om parameters toe te voegen. En pas UPDATE aan met allemaal dezelfde typen bij elkaar. Roep UPDATE op hoeft de volgorde van de kolommen in de tabeldefinitie niet te volgen.

  5. Indien mogelijk (of langetermijnoplossing), overweeg dan om de grootformaattabel van TSZ opnieuw te ontwerpen kolommen in een genormaliseerde vorm van lang formaat.

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

    Hoewel dit 167 rijen zal toevoegen voor elke unieke identifier, zijn rijen in database-ontwerp veel goedkoper dan kolommen, waardoor het opvragen gemakkelijker zal zijn, de gegevensopslag schaalbaarder en het onderhoud efficiënter. Een nieuwe metriek heeft bijvoorbeeld geen nieuw gedefinieerde kolom met alle meta-info nodig, maar gewoon een nieuwe rij. En met Oracle's PIVOT u kunt het grootformaat gemakkelijk opnieuw weergeven.

Al met al is er geen enkele, duidelijke manier om een ​​dergelijke runtime-fout te debuggen die voortkomt uit een API-extensie zoals een databaseverbinding. SQL-syntaxis of verwijzingen naar VBA-objecten kunnen eenvoudig worden afgehandeld, maar gegevensspecifieke problemen vereisen creatief graven door het algehele proces.



  1. Databaseoplossingen voor constructiebeheer

  2. Voeg een afbeelding in de database in met behulp van php

  3. postgresql opgeslagen procedure met query op verschillende schema's

  4. Verschil tussen In-geheugendatabases en schijfgeheugendatabase