sql >> Databáze >  >> RDS >> Oracle

Chyba doby běhu:-2147217887(80040e21) Systém nemůže najít text zprávy pro číslo zprávy 0x80040e21 v souboru zpráv pro OraOLEDB

S tímto množstvím parametrů může být problém jakýkoli jedna položka včetně neshodného datového typu, délky dat atd. Zde je třeba uplatnit umění známé jako ladění.

  1. Pečlivě zkontrolujte datové typy tabulky (T_SAP_ZSSTABL_NEW ). Oracle může mít datové typy, které nelze okamžitě přeložit do typy ADO například BLOB , CLOB , BFILE , vysoce přesné číselné typy, maximální typy znaků nebo typy rozšíření (XML, média atd.).

  2. Zkuste prodloužit délky dat (nebo ponechte prázdné v přiřazení parametru):

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

    V případě potřeby zkontrolujte proměnné délky pomocí Len() jazyka VBA pro vyvolání uživatelského varování před připojením parametrů.

  3. Zkuste spustit SELECT verze dotazu se stejnými parametry, aby se vrátil jeden řádek výsledků. Pokud dojde ke stejné chybě, začněte s prvním parametrem a poté přidejte druhý nebo dávku 10 postupně, abyste izolovali problematickou položku.

    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. Refaktorujte kód pro konzistenci, protože jste možná jeden vynechali nebo jste jeden špatně zarovnali, což se může vyskytnout u mnoha opakujících se řádků. Vždy miřte na kód DRY (Don't Repeat Yourself). Jednou z možností je použít slovník s páry klíč/hodnota namísto 160+ proměnných nebo pojmenovaných rozsahů:

    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
    

    Pokud máte smíšené typy, zkuste pro každý typ vytvořit různé slovníky a postupně je opakovat, abyste přidali parametry. A upravte UPDATE se všemi stejnými typy blízko sebe. Vyvolejte UPDATE nemusí dodržovat pořadí sloupců v definici tabulky.

  5. Je-li to možné (nebo dlouhodobé řešení), zvažte přepracování široké formátovací tabulky TSZ sloupců do normalizované formy dlouhého formátu.

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

    Ačkoli to přidá 167 řádků pro každý jedinečný identifikátor, v návrhu databáze jsou řádky mnohem levnější než sloupce, takže dotazování bude jednodušší a ukládání dat škálovatelnější a údržba efektivnější. Například nová metrika nepotřebuje nový definovaný sloupec se všemi metainformacemi, ale jednoduše nový řádek. A s Oracle PIVOT můžete snadno znovu vykreslit široký formát.

Celkově vzato neexistuje jediný a jasný způsob, jak odladit runtime chybu, jako je tato, která se nese z rozšíření API, jako je připojení k databázi. Syntaxi SQL nebo odkazování na objekty VBA lze snadno zvládnout, ale problémy specifické pro data vyžadují kreativní prozkoumání celého procesu.



  1. Jeden model Django, více stolů?

  2. Zdroje zálohování databáze MySQL a MariaDB

  3. Jak vrátit pozici položky seznamu v MySQL

  4. MySQL:#126 – Nesprávný soubor klíče pro tabulku