我应用程序发送的许许多多的数据,以SAP。Di此,它建立了一个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"是的 数据 我路过的(日期)--没有一种类型。我想类型的领域是 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谢尔本人的回答似乎是为我工作。我会检查日志明天上午和(希望)奖赏金!感谢这么多。


更新:

按照要求,我的版本librfc32.dll 是6403.3.78.4732.

有帮助吗?

解决方案

更新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目录或在应用程序的目录或地方在你%的道路%.

更新2: Sap注意到就像kb的文章。我不知道如果那里是免费的注意的sdn.sap.com 所以我把它送到你的邮件。

更新1: SAP注1000057国:

在多线程沉重的负荷、例外的类型RfcMarshalException参照系统。Xml。Xsl。XsltException作为内部异常,可能会发生。

而不是例外。它值得一试。

修补是可以作为附于本说明之后。

**更新0:**只有一个猜测。但我建议以看穿的问题。这是所有栈?你可以发布部分关闭代码在哪里你通话的sap代码?

其他提示

修改

我仍然认为这是什么做的映射。我相信,RFCTYPE_BCD类型是小数(Business Connector的十进制),因此将难以推动日期值插入它(并可能有时工作?)。我建议重新生成代理,或记录数据时,你得到的错误被编组。像这样的东西(抱歉 - 我们用自己的代理层,所以我并不熟悉的业务接口):

你能翻译以下为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知道,SAP是很讲究的它的日期和时间值的格式。

它看起来像是在试图转换成一个整体或一串(不能告诉由于ToString())到 BCD (二进制编码小数)的类型。

只是一种猜测,希望这有所帮助。

更新:

猜测不。

多线使用同样的联系?这可能不是一个非常好的主意,除非你使用锁,这将使该线变得毫无意义。我敢肯定,SAP支持池连接,所以打开连接在它自己的线(每个螺纹)。

或许它的日期格式问题?你说这不会发生的每一次。结果 所以,当你通过20081202需要“12”作为一天的时段和02在一个月的一部分。这是确定的。结果 但是,当你通过20081219它试图分析19月份和抛出异常?点击 与SAP管理员检查它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top