sql >> Database teknologi >  >> RDS >> Oracle

Run Time error:-2147217887(80040e21) Systemet kan ikke finde en beskedtekst for beskednummeret 0x80040e21 i beskedfilen for OraOLEDB

Med så mange parametre kan problemet være hvilket som helst ét element inklusive uoverensstemmende datatype, datalængde osv. Her skal teknikken kendt som fejlretning udøves.

  1. Kontroller omhyggeligt tabeldatatyperne (T_SAP_ZSSTABL_NEW ). Oracle kan have datatyper, der ikke umiddelbart kan oversættes til ADO-typer såsom BLOB , CLOB , BFILE , numeriske typer med høj præcision, maksimale tegntyper eller udvidelsestyper (XML, medier osv.).

  2. Prøv at forlænge datalængder (eller lad det være tomt i parametertildelingen):

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

    Kontroller om nødvendigt variable længder med VBA's Len() for at rejse en brugeradvarsel før tilføjelse af parametre.

  3. Prøv at køre SELECT version af forespørgsel med samme parametre for at returnere en enkelt række resultater. Hvis den samme fejl opstår, skal du starte med første parameter og derefter tilføje en anden eller batch på 10 sekventielt for at isolere det problematiske element.

    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. Refaktorkode for konsistens, da du måske har misset en eller justeret en forkert, hvilket kan forekomme med mange gentagne linjer. Sigt altid efter DRY (Don't Repeat Yourself) kode. En mulighed er at bruge en ordbog med nøgle/værdi-par i stedet for 160+ variabler eller navngivne områder:

    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
    

    Hvis du har blandede typer, kan du prøve at oprette forskellige ordbøger for hver type og gentage dem i rækkefølge for at tilføje parametre. Og juster UPDATE med alle de samme typer tæt på hinanden. Genkald UPDATE behøver ikke at følge rækkefølgen af ​​kolonner i tabeldefinitionen.

  5. Hvis det er muligt (eller langsigtet løsning), så overvej at re-designe bredformattabellen for TSZ kolonner til en normaliseret form af langt format.

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

    Selvom dette vil tilføje 167 rækker for hver unik identifikator, er rækker i databasedesign meget billigere end kolonner, og derfor vil forespørgsler være nemmere, og datalagring mere skalerbar og vedligeholdelse mere effektiv. For eksempel behøver en ny metric ikke en ny defineret kolonne med al metainformation, men blot en ny række. Og med Oracles PIVOT du kan nemt gengive det brede format.

Alt i alt er der ingen enkelt, klar måde at debugge en runtime-fejl som denne, der er båret fra en API-udvidelse som databaseforbindelse. SQL-syntaks eller VBA-objektreference kan nemt håndteres, men dataspecifikke problemer kræver, at man graver kreativt gennem den overordnede proces.



  1. Sådan overvindes java.sql.SQLException:For mange forbindelser undtagelse?

  2. Pandas to_sql fejler på dubleret primærnøgle

  3. Generel trægennemgang (uendelig) i bredde-først søgemåde

  4. Sådan returnerer du dagens dato til en variabel i Oracle