Domanda

La mia app manda un sacco di dati a SAP. Per di questo, si accumula un oggetto tabella SAP e lo invia sopra. Ottengo questo errore un po 'regolarmente, ma non in modo affidabile:

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)

Cosa c'è di strano è che questo non accade ogni volta. Inoltre, il tipo di .NET si lamenta, "20.081.219" sono i dati sto passando (la data) - non è un tipo. Credo che il tipo di quel campo è RFCTYPE.RFCTYPE_TIME.

Qualche suggerimento su come risolvere questo errore intermittente? C'è una sorta di stato che dovrei clearing tra le chiamate al SAP RFC?


Aggiornamento:

Come richiesto, ecco il codice che chiama SAP:

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

Sto pensando forse più thread stanno utilizzando la stessa connessione in qualche modo. Utilizzando SAP.Connector.GetNewConnection invece non è cambiato nulla.


Aggiornamento:

Sembra che questo problema si verifica anche quando si esegue un singolo thread! Qual è il problema ??

C'è un modo per disattivare il pool di connessioni per vedere se questo risolve esso?


Aggiornamento:

La risposta di @Igal Serban sembra funzionare per me. Vado a controllare la mattina log domani e (si spera) il premio di taglie! Grazie mille.


Aggiornamento:

Come richiesto, la mia versione di librfc32.dll è 6403.3.78.4732.

È stato utile?

Soluzione

Aggiornamento 4: In secondo pensiero, non credo che la versione librfc è importante. L'eccezione sembra venire dal codice gestito. Le opzioni che mi viene in mente sono:

  • Provare a utilizzare il debugger della versione a singolo thread.
  • Il modo magico. Anche senza trovare il bug (che si trova sulla linfa o il vostro codice). Basta cambiare il modo di fare business in grado di farlo andare via. Il suo brutto, ma a volte pratico. In ogni caso il modo consigliato per lo scenario sembra essere quello di utilizzare pool di connessioni, e non creare nuovo oggetto proxy per ogni richiesta. Quindi, qualcosa di simile a questo codice (non testato) può essere utilizzato:

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)
}

Questo esempio sta usando implicitamente il pool di connessioni. L'uso di può essere controllato dal file di configurazione.

Aggiornamento 3: Puoi controllare la versione librfc32.dll e la data? la sua dovrebbe essere nella directory system32 o nella directory dell'applicazione o da qualche parte nel vostro percorso%%.

Aggiornamento 2: le note SAP sono proprio come articoli kb. Non so se v'è libero accesso alla nota nella sdn.sap.com quindi devo inviarlo alla vostra posta.

Aggiornamento 1: nota SAP 1000057 stati:

  

Sotto carico pesante multithread, possono verificarsi eccezioni di tipo RfcMarshalException riferito a System.Xml.Xsl.XsltException come eccezione interna.

Anche se non è esattamente l'eccezione si riceve. Vale la pena di provare.

La patch è disponibile come allegato alla presente nota.

** Aggiornamento 0: ** Solo una supposizione. Ma vorrei suggerire di guardare problemi di threading. Questo è tutto lo stack? Puoi pubblicare la parte fuori dal codice in cui si chiama il codice di linfa?

Altri suggerimenti

Modifica :

Continuo a pensare che sia qualcosa a che fare con la mappatura. Credo che tipo RFCTYPE_BCD è decimale (Business Connector decimale), quindi avrà difficoltà a spingere un valore di data in esso (e potrebbe funzionare a volte?). Vorrei suggerire rigenerare le deleghe, o registrare i dati che vengono schierate quando si ottiene l'errore. Qualcosa di simile a questo (scusate - usiamo il nostro livello di delega, quindi non sono che la familiarità con Business Connector):

Potresti tradurre il seguente in VB (e qualunque sia il formato della struttura 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

Lo so che è un dolore, ma basta fare un rapido e sporco per ottenere alcuni dati per sputare fuori quando si verifica l'errore.

========

A partire da soli la descrizione che hai postato, il meglio che posso venire in mente è forse si sta cercando di schierare un valore di data (20.081.219) in un campo di tempo?

Si può avvolgere la chiamata in un try / catch e registrare i valori della tabella di essere inviato a SAP e inviare quelli che sono qui? Spero ci sia un indizio nei dati.

Lo so dal fare messaggi di servizi web a SAP che SAP è abbastanza particolare circa il formato del suo tempo e valori di data.

Sembra che si sta cercando di convertire un numero intero o una stringa (posso dirvi a causa di ToString ()) ad un BCD (decimale codificato in binario) tipo.

Solo una supposizione, spero che aiuta.

UPDATE:

Non credo.

Più thread utilizzando la stessa connessione? Questo non è probabilmente una buona idea, a meno che non si utilizza di bloccaggio, che renderà il filo inutile. Sono sicuro che SAP supporta pool di connessioni, in modo da aprire la connessione in esso è proprio thread (uno per thread).

Può essere il problema formato data? Lei dice che non succede ogni volta.
Così, quando si passa 20.081.202 ci vuole '12' come una parte giorno e 02 come parte mese. E 'OK.
Ma quando si passa 20.081.219 si tenta di analizzare 19 come un mese e lancia un'eccezione?
Verificare con l'amministratore di SAP.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top