Oracle
 sql >> Database >  >> RDS >> Oracle

Errore di runtime:-2147217887(80040e21) Il sistema non riesce a trovare un testo di messaggio per il numero di messaggio 0x80040e21 nel file di messaggio per OraOLEDB

Con così tanti parametri, il problema può essere qualsiasi un elemento che include tipo di dati, lunghezza dei dati, ecc. non corrispondenti. Qui è dove è necessario esercitare l'arte nota come debug.

  1. Controllare attentamente i tipi di dati della tabella (T_SAP_ZSSTABL_NEW ). Oracle potrebbe avere tipi di dati che non sono immediatamente traducibili in Tipi ADO come BLOB , CLOB , BFILE , tipi numerici ad alta precisione, tipi di caratteri massimi o tipi di estensione (XML, media, ecc.).

  2. Prova ad estendere la lunghezza dei dati (o lascia vuoto nella parametrizzazione):

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

    Se necessario, controlla le lunghezze variabili con Len() di VBA per generare un avviso utente prima di aggiungere parametri.

  3. Prova a eseguire SELECT versione della query con gli stessi parametri per restituire una singola riga di risultati. Se si verifica lo stesso errore, inizia con il primo parametro, quindi aggiungi un secondo o un batch di 10 in sequenza per isolare l'elemento problematico.

    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. Codice di refactoring per coerenza, poiché potresti averne perso uno o disallineato uno che può verificarsi con molte righe ripetitive. Puntare sempre al codice DRY (non ripetere te stesso). Un'opzione è utilizzare un dizionario con coppie chiave/valore invece di oltre 160 variabili o intervalli denominati:

    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
    

    Se disponi di tipi misti, prova a creare dizionari diversi per ogni tipo e ripetili in sequenza per aggiungere parametri. E regola UPDATE con tutti gli stessi tipi uno vicino all'altro. Richiama UPDATE non è necessario seguire l'ordine delle colonne nella definizione della tabella.

  5. Se possibile (o soluzione a lungo termine), valuta la possibilità di riprogettare la tabella di grande formato di TSZ colonne in una forma normalizzata di formato lungo.

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

    Sebbene ciò aggiunga 167 righe per ogni identificatore univoco, nella progettazione del database le righe sono molto più economiche delle colonne e quindi l'esecuzione di query sarà più semplice, l'archiviazione dei dati più scalabile e la manutenzione più efficiente. Ad esempio, una nuova metrica non necessita di una nuova colonna definita con tutte le metainformazioni ma semplicemente di una nuova riga. E con PIVOT di Oracle puoi facilmente renderizzare nuovamente il formato grande.

Tutto sommato, non esiste un modo unico e chiaro per eseguire il debug di un errore di runtime come questo causato da un'estensione API come la connessione al database. La sintassi SQL o il riferimento a oggetti VBA possono essere gestiti facilmente, ma i problemi specifici dei dati richiedono un'analisi creativa dell'intero processo.