Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Błąd czasu wykonywania:-2147217887(80040e21) System nie może znaleźć tekstu komunikatu dla numeru komunikatu 0x80040e21 w pliku komunikatu dla OraOLEDB

Przy tak wielu parametrach problem może być dowolny jeden element zawierający niezgodny typ danych, długość danych itp. W tym miejscu należy ćwiczyć sztukę znaną jako debugowanie.

  1. Dokładnie sprawdź typy danych w tabeli (T_SAP_ZSSTABL_NEW ). Oracle może mieć typy danych, które nie są natychmiast tłumaczone przez Typy ADO takie jak BLOB , CLOB , BFILE , typy liczbowe o wysokiej precyzji, maksymalne typy znaków lub typy rozszerzeń (XML, media itp.).

  2. Spróbuj zwiększyć długości danych (lub pozostaw puste w przypisaniu parametrów):

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

    W razie potrzeby sprawdź zmienne długości za pomocą Len() VBA aby podnieść ostrzeżenie użytkownika przed dołączeniem parametrów.

  3. Spróbuj uruchomić SELECT wersję zapytania z tymi samymi parametrami, aby zwrócić pojedynczy wiersz wyników. Jeśli wystąpi ten sam błąd, zacznij od pierwszego parametru, a następnie dodaj drugą lub partię 10 sekwencyjnie, aby wyizolować problematyczny 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. Kod refaktoryzacji dla spójności, ponieważ mogłeś pominąć jeden lub źle wyrównać, co może wystąpić w przypadku wielu powtarzających się linii. Zawsze celuj w kod DRY (Don't Repeat Yourself). Jedną z opcji jest użycie słownik z parami klucz/wartość zamiast ponad 160 zmiennymi lub nazwanymi zakresami:

    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
    

    Jeśli masz mieszane typy, spróbuj utworzyć różne słowniki dla każdego typu i powtarzaj je po kolei, aby dołączyć parametry. I dostosuj UPDATE ze wszystkimi tymi samymi typami blisko siebie. Przywołaj UPDATE nie musi być zgodna z kolejnością kolumn w definicji tabeli.

  5. Jeśli to możliwe (lub rozwiązanie długoterminowe), rozważ przeprojektowanie tabeli szerokoformatowej TSZ kolumny do znormalizowanej postaci długiego formatu.

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

    Chociaż spowoduje to dodanie 167 wierszy dla każdego unikalnego identyfikatora, w projekcie bazy danych wiersze są znacznie tańsze niż kolumny, dzięki czemu zapytania będą łatwiejsze, a przechowywanie danych bardziej skalowalne, a konserwacja bardziej wydajna. Na przykład nowa metryka nie wymaga nowej zdefiniowanej kolumny ze wszystkimi metainformacjami, ale po prostu nowego wiersza. Oraz z PIVOT Oracle możesz łatwo ponownie wyrenderować szeroki format.

Podsumowując, nie ma jednego, jasnego sposobu debugowania błędu czasu wykonania, takiego jak ten, który pochodzi z rozszerzenia API, takiego jak połączenie z bazą danych. Można łatwo obsługiwać składnię SQL lub odwołania do obiektów VBA, ale problemy związane z danymi wymagają kreatywnego przeanalizowania całego procesu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę połączyć się z internetową bazą danych Oracle za pomocą Java?

  2. Upuszczanie tabeli w Oracle SQL

  3. prosta składnia instrukcji Oracle select

  4. Wydajność Oracle JDBC w zestawie wyników

  5. Czy spust można zablokować; jak ustalić, że tak jest?