SAP .NET Connector: استثناء النظام يتم إلقاؤه أثناء التنظيم .NET

StackOverflow https://stackoverflow.com/questions/381760

سؤال

تطبيقي يرسل الكثير والكثير من البيانات إلى 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)

ما غريب هو أن هذا لا يحدث في كل مرة. أيضا، نوع .NET يشكو من "20081219" هو بيانات أنا أبعز (موعد) - وليس نوعا. أعتقد أن نوع هذا الحقل هو RFCTYPE.RFCTYPE_TIME.

أي اقتراحات حول كيفية استكشاف الأخطاء وإصلاحها هذا الخطأ المتقط؟ هل هناك نوع من الولاية يجب أن أكون مقطعا بين المكالمات إلى SAP RFCS؟


تحديث:

كما طلب، إليك الرمز الذي يستدعي SAP:

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

أنا أفكر ربما مؤشرات الترابط متعددة تستخدم نفس الاتصال بعض كيف. استخدام SAP.Connector.GetNewConnection بدلا من ذلك لم يغير أي شيء.


تحديث:

يبدو أن هذه المشكلة تحدث حتى عندما أقوم بتشغيل مؤشر ترابط واحد! ما هي الصفقة؟؟

هل هناك طريقة لتعطيل تجمع الاتصال لمعرفة ما إذا كان ذلك يعمل عليه؟


تحديث:

إجابة agal serban تبدو تعمل بالنسبة لي. سوف تحقق من السجلات صباح الغد و (نأمل) جائزة Bounty! شكرا جزيلا.


تحديث:

كما طلب، فإن الإصدار الخاص بي من librfc32.dll هو 6403.3.78.4732.

هل كانت مفيدة؟

المحلول

تحديث 4: في الفكر الثاني، لا أعتقد أن إصدار Librfc مهم. يبدو أن الاستثناء يأتي من التعليمات البرمجية المدارة. الخيارات التي يمكنني التفكير فيها هي:

  • حاول استخدام مصحح الأخطاء على الإصدار الواحد الخيوط.
  • الطريقة السحرية. حتى دون العثور على الخطأ (أي على النسغ أو الكود الخاص بك). فقط تغيير الطريقة التي تقوم بها الأعمال يمكن أن تجعلها تذهب بعيدا. لها القبيحة، ولكن في بعض الأحيان عملية. على أي حال، يبدو أن الطريقة الموصى بها لسيناريوك هي استخدام تجمع الاتصال، وعدم إنشاء كائن وكيل جديد لكل طلب. لذلك، يمكن استخدام شيء من هذا القبيل (رمز غير مختبر):

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: هل يمكنك التحقق من الإصدار والتاريخ والتاريخ الخاص بك؟ يجب أن تكون في دليل System32 أو في دليل التطبيق الخاص بك أو في مكان ما في مسار٪٪.

تحديث 2: تلاحظ SAP هي تماما مثل مقالات KB. لا أعرف ما إذا كان هناك حرية الوصول إلى الملاحظة في sdn.sap.com، لذا فقد أرسلتها إلى بريدك.

التحديث 1: SAP ملاحظة 1000057 الولايات:

ضمن الحمل الثقيل متعدد مؤشرات الترابط، فإن استثناءات نوع RFCMARSHALEXCOMECPECTE مع الإشارة إلى system.xml.xsl.xsltexception حيث قد يحدث الاستثناء الداخلي.

في حين ليس بالضبط الاستثناء الذي تتلقاه. انها تستحق المحاولة.

التصحيح متاح كمرفق لهذه الملاحظة.

** التحديث 0: ** فقط تخمين. لكنني أقترح أن ننظر إلى قضايا الخيوط. هل هذا كل المكدس؟ يمكنك نشر الجزء قبالة الرمز حيث يمكنك استدعاء رمز SAP؟

نصائح أخرى

يحرر:

ما زلت أعتقد أن الأمر يتعلق بالتعيين. أعتقد أن نوع RFCTYPE_BCD هو العشري (موصل الأعمال العشرية)، لذلك سيحصل عليه صعوبة في دفع قيمة تاريخ في ذلك (وقد يعمل في بعض الأحيان؟). أود أن أقترح تجديد الوكلاء، أو تسجيل البيانات التي يتم تنظيمها عند الحصول على الخطأ. شيء من هذا القبيل (آسف - نستخدم طبقة الوكيل الخاصة بنا، لذلك أنا لست على دراية موصل الأعمال):

هل يمكن أن تترجم ما يلي إلى VB (وأي شكل تنسيق الهيكل المقاعد):

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