Oracle
 sql >> база данни >  >> RDS >> Oracle

Грешка по време на изпълнение:-2147217887(80040e21) Системата не може да намери текст на съобщение за номер на съобщение 0x80040e21 във файла със съобщения за OraOLEDB

С толкова много параметри проблемът може да бъде всеки един елемент, включващ несъответстващ тип данни, дължина на данните и т.н. Тук трябва да се упражнява изкуството, известно като отстраняване на грешки.

  1. Внимателно проверете типовете данни на таблицата (T_SAP_ZSSTABL_NEW ). Oracle може да има типове данни, които не могат да бъдат незабавно преведени от типове ADO като BLOB , CLOB , BFILE , цифрови типове с висока точност, типове с максимален брой знаци или типове разширения (XML, медии и т.н.).

  2. Опитайте да увеличите дължините на данните (или оставете празно в присвояването на параметри):

    Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR)
    
    Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
    

    Ако е необходимо, проверете променливите дължини с Len() на VBA за извеждане на предупреждение за потребителя преди добавяне на параметри.

  3. Опитайте да изпълните 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 = ?
    
  4. Рефакторирайте кода за последователност, тъй като може да сте пропуснали един или да сте неправилно подравнени, което може да се случи с много повтарящи се редове. Винаги се стремете към СУХ код (не се повтаряйте). Единият вариант е да използвате речник с двойки ключ/стойност вместо 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 не е необходимо да следва реда на колоните в дефиницията на таблицата.

  5. Ако е възможно (или дългосрочно решение), помислете за препроектиране на широкоформатната таблица на TSZ колони в нормализирана форма на дълъг формат.

    ID   POSNR   VBELN   Indicator   Value
     #     XXX     XXX       CHARG     XXX
     #     XXX     XXX       MATNR     XXX
     #     XXX     XXX       MAKTX     XXX
    ...
    

    Въпреки че това ще добави 167 реда за всеки уникален идентификатор, в дизайна на базата данни редовете са много по-евтини от колоните и така заявките ще бъдат по-лесни, а съхранението на данни по-мащабируемо и поддръжката по-ефективна. Например, нов показател не се нуждае от нова дефинирана колона с цялата мета информация, а просто от нов ред. И с PIVOT на Oracle можете лесно да преизобразите широкия формат.

Като цяло, няма единичен, ясен начин за отстраняване на грешки при изпълнение на грешка като тази, породена от разширение на API като връзка с база данни. SQL синтаксисът или препратката към VBA обект могат лесно да бъдат обработени, но специфичните за данните проблеми изискват креативно копаене в цялостния процес.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изтриване на празен етикет от xmltype oracle

  2. Как да ДОБАВИТЕ ИМЕ НА ОГРАНИЧЕНИЕ към вече СЪЩЕСТВУВАЩО ОГРАНИЧЕНИЕ

  3. ORA-01840:входната стойност не е достатъчно дълга за формат на дата в Oracle Вмъкване с помощта на Select

  4. Oracle Ace Промени

  5. Създаване на асоциативен масив на ниво пакет в java