Med så många parametrar kan problemet vara vilket som helst ett objekt inklusive felaktig datatyp, datalängd etc. Här måste tekniken som kallas felsökning utövas.
-
Kontrollera noggrant datatyperna för tabeller (
T_SAP_ZSSTABL_NEW
). Oracle kan ha datatyper som inte omedelbart kan översättas av ADO-typer somBLOB
,CLOB
,BFILE
, numeriska typer med hög precision, maximala teckentyper eller tilläggstyper (XML, media, etc.). -
Prova att utöka datalängder (eller lämna tomt i parametertilldelning):
Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR) Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
Om det behövs, kontrollera variabla längder med VBA:s
Len()
för att höja en användarvarning innan parametrar läggs till. -
Prova att köra
SELECT
version av frågan med samma parametrar för att returnera en enda rad med resultat. Om samma fel inträffar, börja med första parametern och lägg sedan till en andra eller sats om 10 i följd för att isolera det problematiska objektet.SELECT ? AS TSZ_CHARG_PARAM, ? AS TSZ_MATNR_PARAM, ? AS TSZ_MAKTX_PARAM, ... FROM T_SAP_ZSSTABL_NEW WHERE TSZ_VBELN = ? AND TSZ_POSNR = ?
-
Refaktorera kod för konsistens, eftersom du kanske har missat en eller felinriktad en som kan uppstå med många repetitiva rader. Sikta alltid på DRY (Don't Repeat Yourself) kod. Ett alternativ är att använda en ordbok med nyckel/värdepar istället för 160+ variabler eller namngivna intervall:
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
Om du har blandade typer, försök att skapa olika ordböcker för varje typ och iterera dem i sekvens för att lägga till parametrar. Och justera
UPDATE
med alla samma typer nära varandra. ÅterkallaUPDATE
behöver inte följa kolumnernas ordning i tabelldefinitionen. -
Om möjligt (eller långsiktig lösning), överväg att omforma bredformatstabellen för TSZ kolumner till en normaliserad form av långt format.
ID POSNR VBELN Indicator Value # XXX XXX CHARG XXX # XXX XXX MATNR XXX # XXX XXX MAKTX XXX ...
Även om detta kommer att lägga till 167 rader för varje unik identifierare, är rader i databasdesign mycket billigare än kolumner, vilket gör att förfrågningar blir enklare och datalagringen mer skalbar och underhållet mer effektivt. Till exempel behöver ett nytt mått inte en ny definierad kolumn med all metainformation utan bara en ny rad. Och med Oracles
PIVOT
du kan enkelt återrendera bredformatet.
Sammantaget finns det inget enkelt, tydligt sätt att felsöka ett runtime-fel som detta från ett API-tillägg som databasanslutning. SQL-syntax eller VBA-objektreferenser kan enkelt hanteras men dataspecifika problem kräver att man kreativt gräver igenom den övergripande processen.