3

私のアプリは、非常に多くのデータを SAP に送信します。これを行うために、SAP テーブル オブジェクトを作成して送信します。このエラーはある程度定期的に発生しますが、確実ではありません。

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)

奇妙なことは、これが毎回起こるわけではないということです。また、「20081219」という.NETタイプは、私が渡しているデータ(日付)であり、タイプではありません。そのフィールドのタイプは だと思いますRFCTYPE.RFCTYPE_TIME

この断続的なエラーのトラブルシューティング方法に関する提案はありますか? SAP RFC への呼び出しの間にクリアしなければならない状態はありますか?


アップデート:

要求どおり、SAP を呼び出すコードは次のとおりです。

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

複数のスレッドが何らかの方法で同じ接続を使用している可能性があると考えています。代わりに使用SAP.Connector.GetNewConnectionしても何も変わりませんでした。


アップデート:

この問題は、単一のスレッドを実行しても発生するようです! どうしたんだ??

接続プールを無効にして、それが修正されるかどうかを確認する方法はありますか?


アップデート:

@Igal Serbanの答えは私にとってはうまくいっているようです。明日の朝にログをチェックして、(できれば) 報奨金を授与します! 本当にありがとう。


アップデート:

要求どおり、私の librfc32.dll のバージョンは 6403.3.78.4732 です。

4

4 に答える 4

1

更新 4:よく考えてみると、librfc のバージョンは重要ではないと思います。例外はマネージ コードから発生しているようです。私が考えることができるオプションは次のとおりです。

  • シングル スレッド バージョンでデバッガーを使用してみてください。
  • 魔法の方法。バグを見つけなくても(それはSAPまたはあなたのコードにあります)。ビジネスのやり方を変えるだけで、それをなくすことができます。醜いですが、時には実用的です。とにかく、シナリオで推奨される方法は、接続プールを使用し、リクエストごとに新しいプロキシ オブジェクトを作成しないことです。したがって、次のような (テストされていない) コードを使用できます。

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

このサンプルでは、​​暗黙的に接続プールを使用しています。の使用は、構成ファイルから制御できます。

更新 3: librfc32.dll のバージョンと日付を確認していただけますか? これは、system32 ディレクトリ、アプリケーション ディレクトリ、または %path% のどこかにある必要があります。

更新 2: Sap ノートは KB 記事のようなものです。sdn.sap.com のメモに無料でアクセスできるかどうかわからないので、あなたのメールに送信しました。

更新 1: SAP ノート 1000057 には次のように記載されています。

マルチスレッドの高負荷下では、内部例外として System.Xml.Xsl.XsltException を参照する RfcMarshalException 型の例外が発生する場合があります。

正確にはあなたが受け取る例外ではありませんが。それは試みに値します。

パッチは、このノートの添付ファイルとして入手できます。

**更新 0:**推測にすぎません。ただし、スレッドの問題を確認することをお勧めします。これはすべてのスタックですか?sapコードを呼び出すコードの一部を投稿できますか?

于 2008-12-19T21:21:28.020 に答える
1

編集

私はまだそれがマッピングと関係があると思います。RFCTYPE_BCD 型は 10 進数 (ビジネス コネクタ 10 進数) であると私は信じています。そのため、日付値をそれにプッシュするのは困難です (そして、場合によっては機能する可能性があります)。プロキシを再生成するか、エラーが発生したときにマーシャリングされているデータをログに記録することをお勧めします。このようなもの (申し訳ありませんが、私たちは独自のプロキシ レイヤーを使用しているため、ビジネス コネクタにはあまり詳しくありません):

以下を VB に翻訳していただけますか (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

面倒なことはわかっていますが、エラーが発生したときにデータを吐き出すために、手早く汚いことをしてください。

========

あなたが投稿した説明だけから、おそらく日付値 (20081219) を時刻フィールドにマーシャリングしようとしているのではないでしょうか?

その呼び出しを try/catch でラップし、SAP に送信されるテーブルの値をログに記録して、ここに投稿できますか? データにヒントがあることを願っています。

SAP への Web サービスの投稿から、SAP が日時と値の形式に非常にこだわっていることを知っています。

于 2009-03-06T04:38:04.593 に答える
0

日付形式の問題でしょうか?あなたはそれが毎回起こるわけではないと言います。
したがって、20081202を通過すると、「12」が日の部分、02が月の部分になります。大丈夫です。
しかし、20081219に合格すると、19を月として解析しようとし、例外をスローしますか?
SAP管理者に確認してください。

于 2009-03-06T18:21:46.593 に答える
0

整数または文字列 (ToString() が原因でわかりません) をBCD (2 進化 10 進数) 型に変換しようとしているようです。

推測ですが、参考になれば幸いです。

アップデート:

ないと思います。

複数のスレッドが同じ接続を使用していますか? スレッドを無意味にするロックを使用しない限り、これはおそらくあまり良い考えではありません。SAP は接続プールをサポートしていると確信しているので、独自のスレッド (スレッドごとに 1 つ) で接続を開きます。

于 2009-03-06T04:43:16.140 に答える