Ошибка времени выполнения: -2147217887 (80040e21) Системе не удалось найти текст сообщения для номера сообщения 0x80040e21 в файле сообщений для OraOLEDB - PullRequest
0 голосов
/ 21 апреля 2020

Я загружаю данные в лист Excel в базу данных Oracle из 167 столбцов, используя макросы Excel. Я получаю эту ошибку в операторе execute.

Я сталкиваюсь с трудностями при отладке этой ошибки.

Ошибка времени выполнения: -2147217887 (80040e21) Системе не удалось найти текст сообщения для номера сообщения 0x80040e21 в файле сообщений для OraOLEDB

strSQL = "Update T_SAP_ZSSTABL_NEW set TSZ_CHARG = ?, TSZ_MATNR = ?, TSZ_MAKTX = ?, TSZ_MATKL = ?, TSZ_SEC1_MAX = ?, TSZ_SEC2_MAX = ?, TSZ_THICKNESS = ?, TSZ_TDCNO = ?," _
& "TSZ_LENGTH = ?, TSZ_OUT_DIA = ?, TSZ_IN_DIA = ?, TSZ_FKDAT = ?, TSZ_WERKS = ?, TSZ_CUSCD = ?, TSZ_FTRAMT = ?, TSZ_VRKME = ?, TSZ_FKIMG = ?, TSZ_RECDATE1 = ?," _
& "TSZ_QCODE = ?, TSZ_ZWERKS = ?, TSZ_AUART1 = ?, TSZ_MRK_CUST_NM = ?, TSZ_SHTO = ?, TSZ_CHARG1 = ?, TSZ_MATNR1 = ?, TSZ_TOTVAL = ?, TSZ_SPART = ?, TSZ_MANDT = ?," _
& "TSZ_LZONE = ?, TSZ_ZSSCAMT = ?, TSZ_PROD_DATE = ?, TSZ_PROD_ITEM = ?, TSZ_POEDAT = ?, TSZ_ERDAT = ?, TSZ_REFSO = ?, TSZ_AR4DAT = ?, TSZ_AR4NO = ?, TSZ_AR4_TYPE = ?," _
& "TSZ_SECHECESS = ?, TSZ_LIFNR = ?, TSZ_SHIPMD = ?, TSZ_MRK_DEST = ?, TSZ_ZTILAMT = ?, TSZ_ZFC1AMT = ?, TSZ_ZFMCAMT = ?, TSZ_ZINAAMT = ?, TSZ_ZEF0AMT = ?, TSZ_ZWF0AMT = ?," _
& "TSZ_ZCHAAMT = ?, TSZ_ZDCAMT = ?, TSZ_KZWI4 = ?, TSZ_KZWI3 = ?, TSZ_LISTPRICE = ?, TSZ_GROSSWT = ?, TSZ_LAND1 = ?, TSZ_NIELS = ?, TSZ_MVGR1 = ?, TSZ_KONDM = ?, TSZ_AUART = ?," _
& "TSZ_KURRF = ?, TSZ_PGROUP = ?, TSZ_DRAW_TYPE = ?, TSZ_AESKD = ?, TSZ_LOADCHRG = ?, TSZ_LGORT = ?, TSZ_NAME2 = ?, TSZ_SHTNAME = ?, TSZ_TOCIND = ?, TSZ_MARK_CUST_DESC = ?, TSZ_TARE_WEIGHT = ?," _
& "TSZ_GROSS_WEIGHT = ?, TSZ_NET_WEIGHT = ?, TSZ_VKBUR = ?, TSZ_MVGR2 = ?, TSZ_VTWEG = ?, TSZ_SPEC = ?, TSZ_LEN2 = ?, TSZ_LEN1 = ?, TSZ_CLASS = ?, TSZ_END_FINISH = ?, TSZ_SUR_FINISH = ?," _
& "TSZ_CATEGORY = ?, TSZ_MILL = ?, TSZ_RUNDATE = ?, TSZ_CESSVAL = ?, TSZ_WAERK = ?, TSZ_IDLEFRT = ?, TSZ_FRTACCR2 = ?, TSZ_FRTACCR1 = ?, TSZ_STPRS = ?, TSZ_BSTDK = ?, TSZ_POSEX = ?," _
& "TSZ_BSTNK = ?, TSZ_WCAINV = ?, TSZ_J_1ICHID = ?, TSZ_LENGTH_CR = ?, TSZ_PCODE = ?, TSZ_EIKTO = ?, TSZ_KDMAT = ?, TSZ_CPUDT = ?, TSZ_TRGRP = ?, TSZ_DRCPT = ?, TSZ_TRTIME = ?," _
& "TSZ_GRQTY = ?, TSZ_GRNO = ?, TSZ_KDKG2 = ?, TSZ_WAGON_RLY = ?, TSZ_HUBLIFNR = ?, TSZ_TNAME1 = ?, TSZ_LLIEF = ?, TSZ_TRNSIND = ?, TSZ_REGIO = ?, TSZ_DESTDESC = ?, TSZ_DESTCD = ?," _
& "TSZ_VGBEL = ?, TSZ_POSNV = ?, TSZ_VBELV = ?, TSZ_AUPOS = ?, TSZ_AUBEL = ?, TSZ_MRP = ?, TSZ_DISCLP = ?, TSZ_LSTPRC = ?, TSZ_CAMNO = ?, TSZ_KZWI1 = ?, TSZ_DUEDT = ?," _
& "TSZ_ZTERM = ?, TSZ_NETWR = ?, TSZ_OTHERS = ?, TSZ_KWERT = ?, TSZ_SERIAL = ?, TSZ_STCEG = ?, TSZ_TOTAX = ?, TSZ_SRTAX = ?,TSZ_ADDSTAMT = ?, TSZ_STAMT = ?," _
& "TSZ_BSTCSTVAL = ?, TSZ_BSTCSTPERCENT = ?, TSZ_IND = ?, TSZ_EDAMT = ?, TSZ_MATLVAL = ?, TSZ_MATLRATE = ?, TSZ_QTY_METER = ?, TSZ_QTY_NO = ?, TSZ_KUNRG = ?," _
& "TSZ_CUSNAME = ?, TSZ_TYPE = ?, TSZ_PERIOD = ?, TSZ_VKORG = ?, TSZ_FKART = ?, TSZ_ETOIND = ?, TSZ_ZCHARG = ?, TSZ_ZMATNR = ?, TSZ_VTEXT = ?, TSZ_KALKS = ?," _
& "TSZ_VPRS_COST = ?, TSZ_WBS_ELEMENT = ?, TSZ_PRODCTN_ORDER_NO = ?, TSZ_SHOPPING_CART_NO = ?, TSZ_WOODEN_PALLET_WT = ?, TSZ_ZFINCHRG = ?, TSZ_ZATXAMT = ?, TSZ_VBELP1 = ?, TSZ_VBELN1 = ?, TSZ_VBELN_M = ? where TSZ_VBELN = ? and TSZ_POSNR = ?"


cmd.CommandText = strSQL

Set MyParameter = cmd.CreateParameter("CHARG", adVarChar, adParamInput, 10, VBELN)
cmd.Parameters.Append MyParameter

Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 6, POSNR)
cmd.Parameters.Append MyParameter

Set MyParameter = cmd.CreateParameter("MAKTX", adVarChar, adParamInput, 10, CHARG)
cmd.Parameters.Append MyParameter
.
.
.
.
.

. для каждого параметра

И, наконец,

 cmd.Execute

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Ребята, ошибка была в том, что я пытался добавить больше параметров, чем было на самом деле. Имея так много столбцов, я потерял счетчик количества добавляемых блоков. Я должен следовать за лучшими методами более усердно как предложено Parfait. Давайте дадим ему голос. : D

0 голосов
/ 22 апреля 2020

При таком количестве параметров проблема может быть любой один элемент, включая несовпадающий тип данных, длину данных и т. Д. c. Вот где необходимо использовать искусство, известное как отладка.

  1. Тщательно проверьте типы данных таблицы (T_SAP_ZSSTABL_NEW). Oracle может иметь типы данных, которые не могут быть немедленно переведены в toby типы ADO , такие как BLOB, CLOB, BFILE, типы чисел высокой точности c, типы максимальных символов или типы расширений (XML, media, et c.).

  2. Попробуйте увеличить длину данных (или оставьте пустым при назначении параметра):

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

    Если необходимо проверить переменную длину с помощью VBA Len(), чтобы вывести предупреждение пользователя, прежде чем добавлять параметры.

  3. Попробуйте запустить версию запроса SELECT с теми же параметрами, чтобы вернуть одну строку Результаты. Если возникает та же ошибка, начните с первого параметра, затем добавьте вторую или партию 10 последовательно, чтобы изолировать проблемный элемент c.

    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. Код рефакторинга для согласованности, так как вы возможно, пропустили одну или выровняли одну, что может произойти со многими повторяющимися строками. Всегда стремитесь к коду DRY (не повторяйте себя). Одним из вариантов является использование словаря с парами ключ / значение вместо 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. Если возможно (или долгосрочное решение), рассмотрите возможность перепроектирования широкоформатной таблицы * 1042. * TSZ столбцы в нормализованной форме длинного формата.

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

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

В общем, не существует единого, ясного способа отладки ошибки времени выполнения, подобной этой переносится из расширения API, такого как соединение с базой данных. SQL Синтаксис или ссылки на объекты VBA могут быть легко обработаны, но специфичные для данных c проблемы требуют творческого изучения всего процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...