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.
-
Überprüfen Sie sorgfältig die Datentypen der Tabelle (
T_SAP_ZSSTABL_NEW
). Oracle hat möglicherweise Datentypen, die nicht sofort in ADO-Typen wieBLOB
,CLOB
,BFILE
, hochpräzise numerische Typen, maximale Zeichentypen oder Erweiterungstypen (XML, Medien usw.). -
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. -
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 = ?
-
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 SieUPDATE
auf muss nicht der Reihenfolge der Spalten in der Tabellendefinition folgen. -
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.