С толкова много параметри проблемът може да бъде всеки един елемент, включващ несъответстващ тип данни, дължина на данните и т.н. Тук трябва да се упражнява изкуството, известно като отстраняване на грешки.
-
Внимателно проверете типовете данни на таблицата (
T_SAP_ZSSTABL_NEW
). Oracle може да има типове данни, които не могат да бъдат незабавно преведени от типове ADO катоBLOB
,CLOB
,BFILE
, цифрови типове с висока точност, типове с максимален брой знаци или типове разширения (XML, медии и т.н.). -
Опитайте да увеличите дължините на данните (или оставете празно в присвояването на параметри):
Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR) Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
Ако е необходимо, проверете променливите дължини с
Len()
на VBA за извеждане на предупреждение за потребителя преди добавяне на параметри. -
Опитайте да изпълните
SELECT
версия на заявка със същите параметри, за да върне един ред резултати. Ако възникне същата грешка, започнете с първия параметър, след това добавете втори или група от 10 последователно, за да изолирате проблемния елемент.SELECT ? AS TSZ_CHARG_PARAM, ? AS TSZ_MATNR_PARAM, ? AS TSZ_MAKTX_PARAM, ... FROM T_SAP_ZSSTABL_NEW WHERE TSZ_VBELN = ? AND TSZ_POSNR = ?
-
Рефакторирайте кода за последователност, тъй като може да сте пропуснали един или да сте неправилно подравнени, което може да се случи с много повтарящи се редове. Винаги се стремете към СУХ код (не се повтаряйте). Единият вариант е да използвате речник с двойки ключ/стойност вместо 160+ променливи или именувани диапазони:
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
Ако имате смесени типове, опитайте да създадете различни речници за всеки тип и ги итерирайте последователно, за да добавите параметри. И коригирайте
UPDATE
с всички едни и същи типове близо един до друг. ИзвикайтеUPDATE
не е необходимо да следва реда на колоните в дефиницията на таблицата. -
Ако е възможно (или дългосрочно решение), помислете за препроектиране на широкоформатната таблица на TSZ колони в нормализирана форма на дълъг формат.
ID POSNR VBELN Indicator Value # XXX XXX CHARG XXX # XXX XXX MATNR XXX # XXX XXX MAKTX XXX ...
Въпреки че това ще добави 167 реда за всеки уникален идентификатор, в дизайна на базата данни редовете са много по-евтини от колоните и така заявките ще бъдат по-лесни, а съхранението на данни по-мащабируемо и поддръжката по-ефективна. Например, нов показател не се нуждае от нова дефинирана колона с цялата мета информация, а просто от нов ред. И с
PIVOT
на Oracle можете лесно да преизобразите широкия формат.
Като цяло, няма единичен, ясен начин за отстраняване на грешки при изпълнение на грешка като тази, породена от разширение на API като връзка с база данни. SQL синтаксисът или препратката към VBA обект могат лесно да бъдат обработени, но специфичните за данните проблеми изискват креативно копаене в цялостния процес.