Met zoveel parameters kan het probleem elk . zijn één item inclusief niet-overeenkomend gegevenstype, gegevenslengte, enz. Hier moet de kunst die bekend staat als debuggen worden uitgeoefend.
-
Controleer zorgvuldig de gegevenstypen van de tabel (
T_SAP_ZSSTABL_NEW
). Oracle kan datatypes hebben die niet onmiddellijk vertaald kunnen worden door ADO-typen zoalsBLOB
,CLOB
,BFILE
, zeer nauwkeurige numerieke typen, maximale tekentypen of extensietypen (XML, media, enz.). -
Probeer datalengtes uit te breiden (of laat leeg in parametertoewijzing):
Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR) Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
Controleer indien nodig variabele lengtes met VBA's
Len()
om een gebruikerswaarschuwing te geven voordat parameters worden toegevoegd. -
Probeer de
SELECT
. uit te voeren versie van de query met dezelfde parameters om een enkele rij met resultaten te retourneren. Als dezelfde fout optreedt, begin dan met de eerste parameter en voeg vervolgens een tweede of een batch van 10 achtereenvolgens toe om het problematische item te isoleren.SELECT ? AS TSZ_CHARG_PARAM, ? AS TSZ_MATNR_PARAM, ? AS TSZ_MAKTX_PARAM, ... FROM T_SAP_ZSSTABL_NEW WHERE TSZ_VBELN = ? AND TSZ_POSNR = ?
-
Refactor code voor consistentie, omdat u er misschien een hebt gemist of verkeerd uitgelijnd, wat kan voorkomen bij veel herhalende regels. Streef altijd naar DRY (Don't Repeat Yourself) code. Een optie is om een woordenboek met sleutel/waarde-paren in plaats van 160+ variabelen of benoemde bereiken:
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
Als je gemengde typen hebt, probeer dan voor elk type verschillende woordenboeken te maken en herhaal ze in volgorde om parameters toe te voegen. En pas
UPDATE
aan met allemaal dezelfde typen bij elkaar. RoepUPDATE
op hoeft de volgorde van de kolommen in de tabeldefinitie niet te volgen. -
Indien mogelijk (of langetermijnoplossing), overweeg dan om de grootformaattabel van TSZ opnieuw te ontwerpen kolommen in een genormaliseerde vorm van lang formaat.
ID POSNR VBELN Indicator Value # XXX XXX CHARG XXX # XXX XXX MATNR XXX # XXX XXX MAKTX XXX ...
Hoewel dit 167 rijen zal toevoegen voor elke unieke identifier, zijn rijen in database-ontwerp veel goedkoper dan kolommen, waardoor het opvragen gemakkelijker zal zijn, de gegevensopslag schaalbaarder en het onderhoud efficiënter. Een nieuwe metriek heeft bijvoorbeeld geen nieuw gedefinieerde kolom met alle meta-info nodig, maar gewoon een nieuwe rij. En met Oracle's
PIVOT
u kunt het grootformaat gemakkelijk opnieuw weergeven.
Al met al is er geen enkele, duidelijke manier om een dergelijke runtime-fout te debuggen die voortkomt uit een API-extensie zoals een databaseverbinding. SQL-syntaxis of verwijzingen naar VBA-objecten kunnen eenvoudig worden afgehandeld, maar gegevensspecifieke problemen vereisen creatief graven door het algehele proces.