Med så mange parametre kan problemet være hvilket som helst ét element inklusive uoverensstemmende datatype, datalængde osv. Her skal teknikken kendt som fejlretning udøves.
-
Kontroller omhyggeligt tabeldatatyperne (
T_SAP_ZSSTABL_NEW
). Oracle kan have datatyper, der ikke umiddelbart kan oversættes til ADO-typer såsomBLOB
,CLOB
,BFILE
, numeriske typer med høj præcision, maksimale tegntyper eller udvidelsestyper (XML, medier osv.). -
Prøv at forlænge datalængder (eller lad det være tomt i parametertildelingen):
Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR) Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
Kontroller om nødvendigt variable længder med VBA's
Len()
for at rejse en brugeradvarsel før tilføjelse af parametre. -
Prøv at køre
SELECT
version af forespørgsel med samme parametre for at returnere en enkelt række resultater. Hvis den samme fejl opstår, skal du starte med første parameter og derefter tilføje en anden eller batch på 10 sekventielt for at isolere det problematiske 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 = ?
-
Refaktorkode for konsistens, da du måske har misset en eller justeret en forkert, hvilket kan forekomme med mange gentagne linjer. Sigt altid efter DRY (Don't Repeat Yourself) kode. En mulighed er at bruge en ordbog med nøgle/værdi-par i stedet for 160+ variabler eller navngivne områder:
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
Hvis du har blandede typer, kan du prøve at oprette forskellige ordbøger for hver type og gentage dem i rækkefølge for at tilføje parametre. Og juster
UPDATE
med alle de samme typer tæt på hinanden. GenkaldUPDATE
behøver ikke at følge rækkefølgen af kolonner i tabeldefinitionen. -
Hvis det er muligt (eller langsigtet løsning), så overvej at re-designe bredformattabellen for TSZ kolonner til en normaliseret form af langt format.
ID POSNR VBELN Indicator Value # XXX XXX CHARG XXX # XXX XXX MATNR XXX # XXX XXX MAKTX XXX ...
Selvom dette vil tilføje 167 rækker for hver unik identifikator, er rækker i databasedesign meget billigere end kolonner, og derfor vil forespørgsler være nemmere, og datalagring mere skalerbar og vedligeholdelse mere effektiv. For eksempel behøver en ny metric ikke en ny defineret kolonne med al metainformation, men blot en ny række. Og med Oracles
PIVOT
du kan nemt gengive det brede format.
Alt i alt er der ingen enkelt, klar måde at debugge en runtime-fejl som denne, der er båret fra en API-udvidelse som databaseforbindelse. SQL-syntaks eller VBA-objektreference kan nemt håndteres, men dataspecifikke problemer kræver, at man graver kreativt gennem den overordnede proces.