3 Stimmen

SAP .NET Connector: Systemausnahme beim Marschieren des .NET-Typs ausgelöst

Meine Anwendung sendet viele, viele Daten an SAP. Dazu baut sie ein SAP-Tabellenobjekt auf und sendet es weiter. Ich bekomme diesen Fehler einigermaßen 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)

Seltsam ist, dass dies nicht jedes Mal passiert. Außerdem ist der .NET-Typ, über den es sich beschwert, "20081219", die Daten Ich passe (ein Datum) - kein Typ. Ich denke, der Typ dieses Feldes ist RFCTYPE.RFCTYPE_TIME .

Gibt es Vorschläge zur Behebung dieses intermittierenden Fehlers? Gibt es eine Art Status, den ich zwischen den Aufrufen der SAP-RFCs löschen sollte?


Aktualisierung:

Wie gewünscht, hier ist der Code, der SAP aufruft:

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

Ich denke, dass vielleicht mehrere Threads irgendwie dieselbe Verbindung verwenden. Mit SAP.Connector.GetNewConnection stattdessen hat sich nichts geändert.


Aktualisierung:

Es scheint, dass dieses Problem auch dann auftritt, wenn ich einen einzelnen Thread laufen lasse! Woran liegt das?

Gibt es eine Möglichkeit, den Verbindungspool zu deaktivieren, um zu sehen, ob das Problem dadurch behoben wird?


Aktualisierung:

Die Antwort von @Igal Serban scheint bei mir zu funktionieren. Ich werde morgen früh die Logs überprüfen und (hoffentlich) die Prämie vergeben! Vielen Dank!


Aktualisierung:

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

1voto

Igal Serban Punkte 10330

Update 4: Wenn ich es mir recht überlege, glaube ich nicht, dass die librfc-Version wichtig ist. Die Ausnahme scheint aus dem verwalteten Code zu kommen. Die Optionen, die ich denken kann, sind:

  • Versuchen Sie, den Debugger für die Single-Thread-Version zu verwenden.
  • Der magische Weg. Auch ohne den Fehler zu finden (der bei Sap oder Ihrem Code liegt). Wenn Sie einfach Ihre Arbeitsweise ändern, kann der Fehler verschwinden. Das ist hässlich, aber manchmal praktisch. Jedenfalls scheint der empfohlene Weg für Ihr Szenario die Verwendung eines Verbindungspools zu sein, und nicht die Erstellung eines neuen Proxy-Objekts für jede Anfrage. 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)
}

In diesem Beispiel wird implizit der Verbindungspool verwendet. Die Verwendung von kann über die Konfigurationsdatei gesteuert werden.

Update 3: Können Sie bitte die Version und das Datum der librfc32.dll überprüfen? Sie sollte sich im system32-Verzeichnis oder in Ihrem Anwendungsverzeichnis oder irgendwo in Ihrem %path% befinden.

Update 2: Saftscheine sind genau wie KB-Artikel. Ich weiß nicht, ob es einen freien Zugang zu den Notizen auf sdn.sap.com gibt, deshalb habe ich sie an Ihre E-Mail geschickt.

Aktualisierung 1: SAP-Hinweis 1000057 besagt:

Bei hoher Multithreading-Last können Ausnahmen vom Typ RfcMarshalException mit Verweis auf System.Xml.Xsl.XsltException als innere Ausnahme auftreten.

Es ist zwar nicht gerade die Ausnahme, die Sie erhalten. Es ist einen Versuch wert.

Der Patch ist als Anhang zu dieser Mitteilung verfügbar.

**Update 0:**Nur eine Vermutung. Aber ich würde vorschlagen, dass Sie sich mit Threading-Problemen befassen. Ist das alles der Stack? Können Sie den Teil des Codes posten, in dem Sie den Sap-Code aufrufen?

1voto

tsimon Punkte 8182

Editar :

Ich glaube immer noch, dass es etwas mit dem Mapping zu tun hat. Ich glaube, dass der Typ RFCTYPE_BCD dezimal ist (Business Connector Decimal), so dass es schwierig sein wird, einen Datumswert in diesen Typ zu übertragen (und möglicherweise manchmal funktioniert?). Ich würde vorschlagen, die Proxys neu zu generieren, oder die Daten zu protokollieren, die bei Auftreten des Fehlers übertragen werden. Etwa so (Entschuldigung - wir verwenden unsere eigene Proxy-Schicht, daher bin ich mit Business Connector nicht so vertraut):

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

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ß, dass es mühsam ist, aber machen Sie einfach ein Quick-and-Dirty-Verfahren, um einige Daten auszuspucken, wenn der Fehler auftritt.

\========

Aus nur die Beschreibung, die Sie gepostet haben, das Beste, was ich mit kommen kann, ist vielleicht Sie versuchen, einen Datumswert (20081219) in ein Zeitfeld zu marschieren?

Können Sie diesen Aufruf in ein Try/Catch einschließen und die Werte der Tabelle protokollieren, die an SAP gesendet werden, und diese hier posten? Ich hoffe, dass in den Daten ein Hinweis zu finden ist.

Ich weiß, dass SAP bei der Übermittlung von Webdiensten an SAP sehr genau auf das Format der Datums- und Zeitwerte achtet.

0voto

leppie Punkte 111830

Es sieht aus wie es versucht, eine Ganzzahl oder eine Zeichenfolge (kann nicht sagen, wegen ToString()) zu konvertieren, um eine BCD (binär codierter Dezimalwert).

Nur eine Vermutung, ich hoffe, sie hilft.

UPDATE:

Wohl eher nicht.

Mehrere Threads verwenden dieselbe Verbindung? Das ist wahrscheinlich keine gute Idee, es sei denn, Sie verwenden Sperren, was den Thread sinnlos machen würde. Ich bin sicher, dass SAP Verbindungspools unterstützt, also öffnen Sie die Verbindung in einem eigenen Thread (einen pro Thread).

0voto

Maksym Gontar Punkte 22730

Kann es sich um ein Problem mit dem Datumsformat handeln? Sie sagen, es passiert nicht jedes Mal.
Wenn Sie also 20081202 eingeben, wird '12' als Teil des Tages und 02 als Teil des Monats genommen. Das ist in Ordnung.
Aber wenn Sie 20081219 übergeben, versucht es, 19 als Monat zu analysieren und löst eine Ausnahme aus?
Wenden Sie sich an Ihren SAP-Administrator.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X