Question

Mon application envoie beaucoup et beaucoup de données à SAP. Pour ce di, il construit un objet de table SAP et l'envoie sur. Je reçois cette erreur assez régulièrement, mais pas fiable:

System exception thrown while marshaling .NET type 20081219 to RFCTYPE_BCD
   at SAP.Connector.Rfc.RfcMarshal.NetFieldToRfcField(Object src, RFCTYPE type, Encoding encoding, Byte[] dest, Int32 offset, Int32 len, Int32 charSize, Int32 decimals)
   at SAP.Connector.Rfc.RfcStructureUtil.ToRfcStructure(Object obj, Byte[] dest, Type t, Encoding encoding, Boolean isUnicode, PropertyInfo[] propinfos, RfcStructInfo structInfo)
   at SAP.Connector.Rfc.RfcStructureUtil.GetITabFromList(SAPConnection conn, Object list, Type t, RfcStructInfo structInfo, Int32 itab)
   at SAP.Connector.Rfc.RfcClient.PrepareClientParameters(Type classType, MethodInfo m, Boolean isTQRfc, Object[] MethodParamsIn, RFC_PARAMETER[]& paramsIn, RFC_PARAMETER[]& paramsOut, RFC_TABLE[]& tables, ParameterMap[]& paramMaps)
   at SAP.Connector.Rfc.RfcClient.RfcInvoke(SAPClient proxy, String method, Object[] methodParamsIn)
   at SAP.Connector.SAPClient.SAPInvoke(String method, Object[] methodParamsIn)

Ce qui est étrange est que cela ne se produit pas à chaque fois. En outre, le type .NET, il se plaint, "20081219" sont les données Je passe (une date) - pas un type. Je pense que le type de ce champ est RFCTYPE.RFCTYPE_TIME.

Toutes les suggestions sur la façon de résoudre cette erreur intermittente? Y at-il une sorte d'état dans lequel je devrais compensation entre les appels à la SAP RFCs?


Mise à jour:

Comme demandé, voici le code qui appelle SAP:

Using sapConnection As New MySapProxy(ConnectionString)
  sapConnection.Connection.Open()
  sapConnection.TheSapRfcICall(SapOpCode, Nothing, Nothing, sapTable, ResultTable)
End Using

Je pense peut-être plusieurs threads utilisent la même connexion d'une façon. En utilisant SAP.Connector.GetNewConnection au lieu n'a pas changé quoi que ce soit.


Mise à jour:

Il semble que ce problème se produit même quand je lance un seul fil! Quel est le problème ??

Yat-il un moyen de désactiver le pool de connexion pour voir si cela l'arrange?


Mise à jour:

La réponse de @Igal Serban semble fonctionner pour moi. Je vais vérifier les journaux demain matin et (espérons-le) prix de la prime! Merci beaucoup.


Mise à jour:

Comme demandé, ma version de librfc32.dll est 6403.3.78.4732.

Était-ce utile?

La solution

Mise à jour 4: Dans la deuxième pensée, je ne pense pas que la version librfc est important. L'exception semble provenir du code managé. Les options que je peux penser sont:

  • Essayez d'utiliser débogueur sur la version mono-thread.
  • La façon magique. Même sans trouver le bug (C'est la sève ou votre code). Il suffit de changer la façon dont vous faites des affaires peut faire disparaître. Son laid, mais parfois pratique. Quoi qu'il en soit la méthode recommandée pour votre scénario semble être d'utiliser la piscine de connexion et ne pas créer de nouvel objet proxy pour chaque demande. Donc, quelque chose comme ce code (non testé) peut être utilisé:

MySapProxy proxy = new MySapProxy(); // do this only once.

// and in you main loop:
using (proxy.Connection = Connection.GetConnection(connectionString))
{
    proxy.TheSapRfcICall(SapOpCode, Nothing, Nothing, sapTable, ResultTable)
}

Cet exemple utilise implicitement le pool de connexion. L'utilisation de peut être contrôlé à partir du fichier de configuration.

Mise à jour 3: Pouvez-vous s'il vous plaît vérifier votre version librfc32.dll et la date? son devrait être dans le répertoire system32 ou dans votre répertoire d'applications ou quelque part dans votre% path%.

Mise à jour 2: Notes Sap sont comme des articles kb. Je ne sais pas s'il y a un accès gratuit à la note dans le sdn.sap.com donc je l'envoyer à votre courrier.

Mise à jour 1: Note SAP 1000057 états:

  

En cas de charge lourde multithread, des exceptions de type RfcMarshalException avec référence à System.XML.xsl.XsltException comme exception interne peut se produire.

Alors pas exactement l'exception que vous recevez. Cela vaut la peine d'essayer.

Patch est disponible en pièce jointe à la présente note.

0 ** Mise à jour: ** Seule une estimation. Mais je suggère d'examiner les questions de filetage. Est-ce toute la pile? Pouvez-vous mettre la partie hors du code où vous appelez le code de sève?

Autres conseils

Modifier :

Je pense toujours qu'il est quelque chose à voir avec la cartographie. Je crois que le type de RFCTYPE_BCD est décimal (Business décimal Connector), donc il avoir des difficultés à pousser une valeur de date en elle (et pourrait éventuellement travailler parfois?). Je suggère régénérant les procurations, ou enregistrer les données rassemblèrent lorsque vous obtenez l'erreur. Quelque chose comme ça (désolé - nous utilisons notre propre couche proxy, donc je ne suis pas familier avec Business Connector):

Pouvez-vous traduire ce qui suit dans VB (et quel que soit le format de la structure est sapTable):

Using sapConnection As New MySapProxy(ConnectionString)
  sapConnection.Connection.Open()
  try {
    sapConnection.TheSapRfcICall(SapOpCode, Nothing, Nothing, sapTable, ResultTable)
  } catch (Exception e) {
    StringBuilder sb = new StringBuilder();
    foreach (Field f in sapTable.Fields) {
      sb.AppendLine(f.Name + "=" f.Value);
    }
    sb.AppendLine(e.StackTrace);
    File.AppendAllText("C:\\Exception_" + DateTime.Now.ToString("u") + ".txt", sb.ToString());
  }
End Using

Je sais que c'est une douleur, mais juste un ne rapide et sale pour obtenir des données à cracher lorsque l'erreur se produit.

========

À partir de seulement la description que vous avez posté, le meilleur que je peux trouver est peut-être vous essayez de rassembler une valeur de date (20081219) dans un champ de temps?

Pouvez-vous envelopper cet appel dans un try / catch et enregistrer les valeurs de la table étant envoyées à SAP et après ceux qui sont ici? J'espère qu'il ya un indice dans les données.

Je sais que de faire des messages de service Web pour SAP SAP est tout à fait particulier sur le format de son temps de date et valeurs.

On dirait qu'il tente de convertir un entier ou une chaîne (cant dire en raison de ToString ()) à BCD (décimal codé binaire) type.

Juste une supposition, espérons que ça aide.

Mise à jour:

Devinez pas.

Plusieurs threads en utilisant la même connexion? C'est probablement pas une très bonne idée, sauf si vous utilisez le verrouillage, qui fera le fil inutile. Je suis sûr SAP prend en charge les pools de connexion, afin d'ouvrir la connexion dans son propre fil (un par thread).

Que ce soit la question du format de la date? Vous dites que cela ne se produit pas à chaque fois.
Alors, quand vous passez 20081202 il faut « 12 » comme une partie de la journée et 02 comme une partie de mois. Il est OK.
Mais quand vous passez 20081219 il essaie d'analyser 19 un mois et émet une exception?
Vérifiez avec votre administrateur SAP.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top