문제

내 앱은 많은 데이터를 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입니다.

도움이 되었습니까?

해결책

Update 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 : 업데이트 3. librfc32.dll 버전과 날짜를 확인해 주시겠습니까? System32 디렉토리 또는 응용 프로그램 디렉토리 또는 %경로 %의 어딘가에 있어야합니다.

Update 2: SAP 메모는 KB 기사와 같습니다. sdn.sap.com에 메모에 무료로 액세스 할 수 있는지 모르겠습니다.

Update 1: SAP Note 100057 상태 :

Multithreaded Heavy Load에서 System.xml.xsl.xsltexception을 참조하여 rfcmarshalexception 유형의 예외는 내부 예외가 발생할 수 있습니다.

당신이받는 예외는 아니지만. 시도해 볼 가치가 있습니다.

패치는이 메모에 첨부 파일로 사용할 수 있습니다.

** 업데이트 0 : ** 추측 만. 그러나 나는 스레딩 문제를 살펴 보는 것이 좋습니다. 이것이 모든 스택입니까? SAP 코드를 호출하는 코드에 부품을 게시 할 수 있습니까?

다른 팁

편집하다:

나는 아직도 그것이 매핑과 관련이 있다고 생각합니다. RFCTYPE_BCD 유형은 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)를 시간 필드로 마샬링하려고하는 것입니다.

시도/캐치로 전화를 걸고 SAP에 전송되는 테이블의 값을 로그인하고 여기에 게시 할 수 있습니까? 데이터에 단서가 있기를 바랍니다.

웹 서비스 게시물을 SAP에 수행하여 SAP가 날짜 시간 및 값의 형식에 대해 매우 특별하다는 것을 알고 있습니다.

정수 나 문자열을 변환하려고하는 것 같습니다 (tostring ()로 인해 말할 수 없음) BCD (이진 코드 소수점) 유형.

단지 추측, 도움이되기를 바랍니다.

업데이트:

추측하지 마십시오.

동일한 연결을 사용하는 여러 스레드? 잠금을 사용하지 않으면 스레드를 무의미하게 만듭니다. SAP가 연결 풀을 지원하므로 자체 스레드 (스레드 당 하나)에서 연결을 엽니 다.

날짜 형식 문제가 될 수 있습니까? 당신은 매번 일어나지 않는다고 말합니다.
따라서 20081202를 통과하면 '12'를 하루 부분으로, 한 달 부분으로 02가 걸립니다. 괜찮아.
그러나 20081219 년을 통과하면 19 개를 한 달로 구문 분석하고 예외를 던지십니까?
SAP 관리자에게 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top