Frage

Meine App sendet sehr viele Daten an SAP. Um di Dazu baut sie ein SAP-Tabellenobjekt und sendet sie über. Ich erhalte diese Störung etwas regelmäßig, aber nicht zuverlässig:

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)

Was seltsam ist, dass dies nicht jedes Mal passiert. Außerdem ist es die .NET-Typ beschwert sich über „20081219“ ist die Daten Ich bin vorbei (ein Datum) - kein Typ. Ich denke, die Art des Feldes ist RFCTYPE.RFCTYPE_TIME.

Alle Vorschläge, wie diese intermittierenden Fehler zu beheben? Gibt es irgendeine Art von Zustand, den ich zwischen den Aufrufen der SAP RFCs werden Clearing sollte?


Update:

Wie gewünscht, hier ist der Code, der SAP-Anrufe:

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

Ich denke, vielleicht mehrere Threads einige, wie die gleiche Verbindung. Mit SAP.Connector.GetNewConnection stattdessen nichts geändert hat.


Update:

Es scheint, dieses Problem auftritt, auch wenn ich einen einzigen Thread laufen! Was ist der Deal ??

Gibt es eine Möglichkeit, den Verbindungspool zu deaktivieren, um zu sehen, ob es das behebt?


Update:

@Igal Serban Antwort scheint für mich zu arbeiten. Ich werde die Protokolle morgen früh prüfen und (hoffentlich) preis die Prämie! Vielen Dank.


Update:

Wie gewünscht, meine Version von librfc32.dll ist 6403.3.78.4732.

War es hilfreich?

Lösung

Update 4: In zweitem Gedanken, ich glaube nicht, dass die librfc Version ist wichtig. Die Ausnahme scheint vom verwalteten Code zu kommen. Die Optionen, die ich denken kann, sind:

  • Versuchen Debugger auf der Single-Threaded-Version zu verwenden.
  • Die magische Art und Weise. Auch ohne die Fehler zu finden (Das ist auf Saft oder Code). Nur die Änderung der Art und Weise Sie Geschäfte machen kann es weg. Seine hässlich, aber manchmal praktisch. Wie auch immer die empfohlene Methode für Ihr Szenario scheint Connection-Pool zu bedienen, und nicht für jede Anforderung neues Proxy-Objekt zu erstellen. So etwas wie diese (ungetestet) Code kann verwendet werden:

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

Diese Probe wird mit implizit den Verbindungspool. Die Verwendung von aus der Konfigurationsdatei gesteuert werden.

Update 3: Können Sie bitte überprüfen Sie Ihre librfc32.dll Version und das Datum? sein in system32-Verzeichnis oder in Ihrem Anwendungsverzeichnis oder irgendwo in Ihrem% path% liegen sollte.

Update 2: SAP-Hinweise wie kb Artikel sind. Ich weiß nicht, ob es auf die Note in den sdn.sap.com freien Zugang ist, damit ich es zu Ihrer E-Mail schicken.

Update 1: SAP-Hinweis 1000057 lautet:

  

Unter multithreaded schwerer Last, Ausnahmen vom Typ RfcMarshalException mit Bezug auf System.Xml.Xsl.XsltException als innere Ausnahme auftreten können.

Während nicht genau die Ausnahme, die Sie erhalten. Es lohnt sich ein Versuch.

Patch ist als Anhang dieser Bemerkung zur Verfügung.

** Update 0: ** Nur eine Vermutung. Aber ich würde vorschlagen, bei Threadingprobleme zu suchen. Ist der ganze Stapel? Können Sie das Teil aus dem Code, wo Sie den SAP-Code nennen?

Andere Tipps

Bearbeiten :

Ich denke immer noch, es ist etwas mit dem Mapping zu tun. Ich glaube, dass RFCTYPE_BCD Typ dezimal (Business Connector Dezimal), so wird es Schwierigkeiten haben, einen Datumswert in sie drücken (und könnte möglicherweise manchmal funktionieren?). Ich würde vorschlagen, die Proxys Regenerieren oder melden Sie sich die Daten vermarshallten werden, wenn Sie den Fehler. So etwas wie diese (sorry - wir verwenden unsere eigene Proxy-Schicht, also bin ich nicht so vertraut mit Business Connector):

Könnten Sie das folgende in VB (und was auch immer das Format der sapTable Struktur ist) übersetzen:

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

Ich weiß, es ist ein Schmerz ist, sondern nur noch einige Daten ausspucken eine schnelle und schmutzig zu machen, wenn der Fehler auftritt.

========

Von gerade die Beschreibung, die Sie geschrieben haben, das Beste, was ich mit oben kommen kann, ist vielleicht versuchen Sie einen Datumswert (20081219) in ein Zeitfeld Marschall?

Können Sie diesen Anruf in einem try / catch wickeln und melden Sie sich die Werte der Tabelle an SAP geschickt und hier posten die? Ich hoffe, es gibt einen Anhaltspunkt in den Daten.

Ich weiß von Web-Service-Nachrichten an SAP zu tun, dass SAP ganz besonders über das Format seines Datum Zeit ist & Wert.

Es sieht aus wie es eine ganze Zahl oder eine Zeichenfolge zu konvertieren versucht (kippt aufgrund ToString sagen ()) zu einem BCD (binär codierte Dezimalzahl) eingeben.

Nur eine Vermutung, hoffe, es hilft.

UPDATE:

Vermutung nicht.

Mehrere Threads die gleiche Verbindung mit? Das ist wahrscheinlich nicht eine sehr gute Idee, es sei denn, Sie Verriegelung verwenden, das den Faden sinnlos machen. Ich bin sicher, dass SAP-Verbindungspools unterstützt, so öffnen Sie die Verbindung in einem eigenen Thread (eine pro Thread).

Kann es das Datumsformat Problem sein? Sie sagen, es geschieht nicht jedes Mal.
Also, wenn Sie 20081202 passieren dauert es ‚12‘ als Tag Teil und 02 als einen Monat teil. Es ist in Ordnung.
Aber wenn man 20081219 passieren versucht es 19 als einen Monat zu analysieren und wirft Ausnahme?
Prüfen Sie es mit Ihrem SAP-Administrator.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top