Pregunta

Mi aplicación envía montones y montones de datos a SAP. Para di esto, se acumula un objeto tabla SAP y lo envía a través. Me sale este error un poco regular, pero no de forma fiable:

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)

Lo raro es que esto no sucede todo el tiempo. Además, el tipo .NET se queja, "20081219" es los datos de Estoy de paso (una fecha) - no un tipo. Creo que el tipo de campo que es RFCTYPE.RFCTYPE_TIME.

¿Alguna sugerencia sobre cómo solucionar este error intermitente? ¿Hay algún tipo de estado que debería estar limpiando entre llamadas a la RFC SAP?


Actualización:

Conforme a lo solicitado, aquí está el código que llama a SAP:

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

Estoy pensando que tal múltiples hilos están utilizando la misma conexión de alguna forma. Usando SAP.Connector.GetNewConnection lugar no ha cambiado nada.


Actualización:

Parece que este problema se produce incluso cuando corro un solo hilo! Cuál es el problema ??

¿Hay una manera de desactivar la agrupación de conexiones para ver si se soluciona el problema?


Actualización:

La respuesta de @Igal Serban parece estar funcionando para mí. Voy a comprobar los registros de la mañana de mañana y (con suerte) premio el botín! Muchas gracias.


Actualización:

Según lo solicitado, mi versión de librfc32.dll es 6403.3.78.4732.

¿Fue útil?

Solución

Actualización 4: En segundo pensamiento, no creo que la versión librfc es importante. La excepción parece venir desde el código administrado. Las opciones que se me ocurren son:

  • Trate de usar depurador en la versión de un solo subproceso.
  • La forma mágica. Incluso sin encontrar el error (que es la savia o su código). Simplemente cambiando la forma de hacer negocios puede hacer que desaparezca. Su feo, pero a veces práctico. De todos modos la forma recomendada para su escenario parece ser el uso de agrupación de conexiones, y no crear nuevo objeto proxy para cada solicitud. Así que algo como el código (no probado) se puede utilizar:

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

Esta muestra está utilizando de manera implícita la agrupación de conexiones. El uso de puede ser controlado desde el archivo de configuración.

Actualización 3: ¿Puede usted compare su versión librfc32.dll y la fecha? su debe estar en el directorio system32 o en el directorio de aplicación o en algún lugar de su% ruta%.

Actualización 2: notas de SAP son como los artículos de la BC. No sé si hay libre acceso a la nota en el sdn.sap.com así que tengo que enviar a su correo.

Actualización 1: Nota SAP 1000057 estados:

  

Bajo carga pesada multiproceso, pueden producirse excepciones de tipo RfcMarshalException con referencia a System.Xml.Xsl.XsltException como excepción interna.

Aunque no es exactamente la excepción que recibe. Vale la pena probarlo.

Patch está disponible como archivo adjunto a esta nota.

0 ** Actualización: ** Sólo una conjetura. Pero yo sugeriría mirar a problemas de threads. ¿Es esto todo la pila? Se puede publicar la parte de la código, donde se llama al código de savia?

Otros consejos

Editar

Todavía pienso que es algo que ver con la asignación. Creo que el tipo RFCTYPE_BCD es decimal (Business Connector decimal), por lo que tendrá dificultades para empujar un valor de fecha en él (y, posiblemente, podría funcionar a veces?). Yo sugeriría la regeneración de los servidores proxy, o registrar los datos que se están marshalled cuando se obtiene el error. Algo como esto (lo siento - usamos nuestra propia capa proxy, así que no estoy tan familiarizado con Business Connector):

Podría traducir el siguiente en VB (y cualquiera que sea el formato de la estructura sapTable es):

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

Sé que es un dolor, pero acaba de hacer una rápida y sucia para obtener algunos datos de escupir cuando se produce el error.

========

A partir de sólo la descripción que has enviado, lo mejor que puedo llegar a es tal vez usted está tratando de formar un valor de fecha (20081219) en un campo de tiempo?

Se puede concluir que la llamada en un try / catch y registrar los valores de la tabla que se envían a SAP y publicar los que están aquí? Estoy esperando que haya una pista en los datos.

Sé por hacer anuncios de servicios web para SAP que SAP es bastante particular sobre el formato de su tiempo y los valores de fecha.

Parece que se está tratando de convertir un número entero o una cadena (no puedo decir debido a ToString ()) para un BCD (decimal codificado en binario) de tipo.

Apenas una conjetura, espero que ayude.

ACTUALIZACIÓN:

Creo que no.

Varios subprocesos utilizando la misma conexión? Esto probablemente no es una muy buena idea, a menos que utilice bloqueo, lo que hará que el hilo sin sentido. Estoy seguro de SAP soporta los conjuntos de conexiones, por lo que abrir la conexión en su propio hilo (una por hilo).

Que sea el tema formato de fecha? Usted dice que no sucede cada vez.
Así que cuando se pasa 20.081.202 que se necesita '12' como parte de día y 02 meses como parte. Está bien.
Pero cuando se pasa 20081219 intenta analizar 19 como un mes y lanza una excepción?
Compruebe con el administrador de SAP.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top