سؤال

أواجه مشاكل مع أحد تطبيقاتنا.إنها عملية .NET 3.5 32 بت.عند بدء التشغيل، نفتح ملف mdb. لقراءة بعض قيم "بيانات التعريف".يعمل هذا على مئات الأنظمة، ولكن لدينا عميل لديه جهاز كمبيوتر لوحي ويعاني من مشاكل.نظام التشغيل هو Windows XP Tablet PC SP3، 32 بت، بلا بلا.لا شيء غير طبيعي.يحتوي على .NET 3.5 (من Windows Update) محدث بالكامل.لا شيء خارج عن المألوف.

نظرًا لأن تطبيقنا يقوم بـ "بعض الأشياء" أثناء بدء التشغيل، فقد قمت بإنشاء أبسط تطبيق لوحدة التحكم على الإطلاق:

namespace TestAccessConnection
{
    class Program
    {
        static void Main( string[] args )
        {
            OleDbConnection connection;
           try
            {
                connection =
                    new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=metadata.mdb;Persist Security Info=False");
                connection.Open();
                connection.Close();
                Console.Read();
            }
            catch ( Exception e )
            {
                Console.WriteLine(e.ToString());
                Console.Read();
            }
        }
    }
}

نتائج:

إذا قمنا بتنفيذ ملف .exe هذا بدون الملف "metadata.mdb" في نفس المسار، فسنحصل على ما هو واضح:"لم يتم العثور على الملف bla bla bla".هذا صحيح.

إذا قمنا بنسخ البيانات الوصفية (المزيد عن البيانات الوصفية لاحقًا)، نحصل على هذا:

System.OutOfMemoryException: An exception of type 'System.OutOfMemoryException' has occurred.
  at System.Data.Common.ADP.IsSysTxEqualSysEsTransaction()
  at System.Data.Common.ADP.NeedManualEnlistment()
  at System.Data.OleDb.OleDbConnection.Open()
  at TestAccessConnection.Program.Main(String[] args

ملحوظة:كان الاستثناء باللغة الإسبانية وقمت بترجمته، لكن المحتوى ظل كما هو، وكانت الاختلافات الوحيدة هي "استثناء النوع"، لكن مساحات الأسماء لم تمس

ماذا يوجد في البيانات الوصفية؟:إنه ملف MS ACCESS 2000 بسيط يحتوي على جدول واحد واثنين من السجلات (يقوم بتخزين سلاسل اتصال MS-SQL مختلفة في نموذج مشفر)، لذلك عند بدء التشغيل يمكننا قراءة الاتصالات وفك تشفيرها وتقديم قائمة ليختارها المستخدم اتصالات مختلفة.لا توجد (أو يتم تنفيذ) أي من هذه الوظائف في برنامج الاختبار الذي قمت بإنشائه، حيث تم طرح الاستثناء (على ما يبدو) في Connection.Open()

المزيد عن هذا الكمبيوتر على وجه الخصوصيبدو الصندوق طبيعيا.لقد قمنا بإعادة تثبيت .NET من مصادر مختلفة (Windows Update) وdotnetfx.exe (الملف الكبير الذي يبلغ حجمه 250 ميجابايت) وقمنا أيضًا بتنفيذ "إصلاح" من برنامج تثبيت .net الكبير هذا.يبدو أن .NET يعمل، نظرًا لأن تطبيق وحدة التحكم الصغير هذا يستهدف .NET 3.5.

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

ماذا عن جوجل؟لقد كنت أبحث بشكل محموم في google/SO/etc.ولكن دون جدوى.يعد OutOfMemory مصطلح بحث مضللًا للغاية، حتى عندما يقترن بـ oledb والكلمات الرئيسية "المحتملة" الأخرى (على الرغم من أنني قد أفتقد شيئًا ما).تشير محاولة البحث باستخدام أجزاء أخرى من مساحات الأسماء إلى نتائج غريبة لا يبدو أنها مرتبطة بهذه المشكلة تحديدًا.

ما هو السؤال؟أوه، هذا بسيط:أيه أفكار؟

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

شكرا لك مقدما!

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

المحلول

لقد توقف هذا منذ أكثر من عام، ومنذ ذلك الحين قمت بنقل الكود لاستخدام ملف XML صغير واحد.ولم نواجه أي مشاكل منذ ذلك الحين.

يبدأ التطبيق بشكل أساسي، وإذا لم يكتشف XML، فإنه يبحث عن MDB، وإذا عثر عليه، فإنه يحاول فتحه (دائما اكتشاف الأخطاء المحتملة)، وإذا كان بإمكانه فتحه، فإنه يقرأ المحتويات وينشئ XML، يحفظه ويغلق MDB إلى الأبد :)

وقد عملت مع أكثر من 1000 جهاز حتى الآن، ولكن سبب خطأ الذاكرة لا يزال مجهولاً.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top