Oracle
 sql >> Base de données >  >> RDS >> Oracle

Erreur d'exécution :-2147217887(80040e21) Le système ne trouve pas de texte de message pour le numéro de message 0x80040e21 dans le fichier de message pour OraOLEDB

Avec autant de paramètres, le problème peut être n'importe lequel un élément comprenant un type de données incompatible, une longueur de données, etc. C'est là que l'art connu sous le nom de débogage doit être exercé.

  1. Vérifiez soigneusement les types de données de la table (T_SAP_ZSSTABL_NEW ). Oracle peut avoir des types de données qui ne sont pas immédiatement traduisibles par Types ADO comme BLOB , CLOB , BFILE , types numériques de haute précision, types de caractères maximum ou types d'extension (XML, média, etc.).

  2. Essayez d'étendre les longueurs de données (ou laissez vide dans l'affectation des paramètres) :

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

    Si nécessaire, vérifiez les longueurs variables avec Len() de VBA pour déclencher un avertissement utilisateur avant d'ajouter des paramètres.

  3. Essayez d'exécuter le SELECT version de la requête avec les mêmes paramètres pour renvoyer une seule ligne de résultats. Si la même erreur se produit, commencez par le premier paramètre, puis ajoutez un deuxième ou un lot de 10 de manière séquentielle pour isoler l'élément problématique.

    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. Refactorisez le code pour plus de cohérence, car vous en avez peut-être manqué un ou mal aligné, ce qui peut se produire avec de nombreuses lignes répétitives. Visez toujours le code DRY (Don't Repeat Yourself). Une option consiste à utiliser un dictionnaire avec des paires clé/valeur au lieu de plus de 160 variables ou plages nommées :

    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
    

    Si vous avez des types mixtes, essayez de créer différents dictionnaires pour chaque type et itérez-les dans l'ordre pour ajouter des paramètres. Et ajustez UPDATE avec tous les mêmes types à proximité les uns des autres. Rappeler UPDATE n'a pas besoin de suivre l'ordre des colonnes dans la définition de table.

  5. Si possible (ou solution à long terme), envisagez de reconcevoir le tableau grand format de TSZ colonnes dans une forme normalisée de format long.

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

    Bien que cela ajoutera 167 lignes pour chaque identifiant unique, dans la conception de la base de données, les lignes sont beaucoup moins chères que les colonnes et l'interrogation sera donc plus facile, le stockage des données plus évolutif et la maintenance plus efficace. Par exemple, une nouvelle métrique n'a pas besoin d'une nouvelle colonne définie avec toutes les méta-informations, mais simplement d'une nouvelle ligne. Et avec le PIVOT d'Oracle vous pouvez facilement restituer le format large.

Dans l'ensemble, il n'y a pas de moyen unique et clair de déboguer une erreur d'exécution comme celle-ci provenant d'une extension d'API comme la connexion à la base de données. La syntaxe SQL ou le référencement d'objets VBA peuvent être facilement gérés, mais les problèmes spécifiques aux données nécessitent de creuser de manière créative tout au long du processus.