Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Laufzeitfehler:-2147217887(80040e21) Das System kann keinen Nachrichtentext für die Nachrichtennummer 0x80040e21 in der Nachrichtendatei für OraOLEDB finden

Bei so vielen Parametern kann das Problem beliebig sein ein Element, das nicht übereinstimmenden Datentyp, Datenlänge usw. enthält. Hier muss die als Debugging bekannte Kunst ausgeübt werden.

  1. Überprüfen Sie sorgfältig die Datentypen der Tabelle (T_SAP_ZSSTABL_NEW ). Oracle hat möglicherweise Datentypen, die nicht sofort in ADO-Typen wie BLOB , CLOB , BFILE , hochpräzise numerische Typen, maximale Zeichentypen oder Erweiterungstypen (XML, Medien usw.).

  2. Versuchen Sie, die Datenlänge zu erweitern (oder bei der Parametrierung leer zu lassen):

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

    Überprüfen Sie bei Bedarf variable Längen mit Len() von VBA um vor dem Anhängen von Parametern eine Benutzerwarnung auszulösen.

  3. Versuchen Sie, SELECT auszuführen Version der Abfrage mit denselben Parametern, um eine einzelne Ergebniszeile zurückzugeben. Wenn derselbe Fehler auftritt, beginnen Sie mit dem ersten Parameter und fügen Sie dann einen zweiten oder einen Satz von 10 nacheinander hinzu, um das problematische Element zu isolieren.

    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. Refactoring-Code für Konsistenz, da Sie möglicherweise eine verpasst oder falsch ausgerichtet haben, was bei vielen sich wiederholenden Zeilen auftreten kann. Zielen Sie immer auf DRY (Don't Repeat Yourself) Code. Eine Option ist die Verwendung eines Wörterbuch mit Schlüssel/Wert-Paaren statt über 160 Variablen oder benannten Bereichen:

    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
    

    Wenn Sie gemischte Typen haben, versuchen Sie, verschiedene Wörterbücher für jeden Typ zu erstellen, und wiederholen Sie sie nacheinander, um Parameter anzuhängen. Und UPDATE anpassen mit allen gleichen Typen nebeneinander. Rufen Sie UPDATE auf muss nicht der Reihenfolge der Spalten in der Tabellendefinition folgen.

  5. Wenn möglich (oder langfristige Lösung), erwägen Sie, die Breitformattabelle von TSZ neu zu gestalten Spalten in eine normalisierte Form des Langformats.

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

    Obwohl dies 167 Zeilen für jeden eindeutigen Bezeichner hinzufügt, sind Zeilen im Datenbankdesign viel billiger als Spalten, sodass die Abfrage einfacher, die Datenspeicherung skalierbarer und die Wartung effizienter wird. Beispielsweise benötigt eine neue Metrik keine neu definierte Spalte mit allen Metainformationen, sondern einfach eine neue Zeile. Und mit Oracles PIVOT Sie können das Breitformat problemlos erneut rendern.

Alles in allem gibt es keinen eindeutigen Weg, einen solchen Laufzeitfehler zu debuggen, der von einer API-Erweiterung wie einer Datenbankverbindung verursacht wird. Die Referenzierung von SQL-Syntax oder VBA-Objekten kann leicht gehandhabt werden, aber datenspezifische Probleme erfordern ein kreatives Graben durch den gesamten Prozess.