سؤال

لدي كتلة من التعليمات البرمجية تهدف إلى سحب وصف النص من جدول قاعدة البيانات وحفظها إلى ملف نصي.يبدو مثل هذا (C# .NET):

        OdbcCommand getItemsCommand = new OdbcCommand("SELECT ID FROM ITEMS", databaseConnection);
        OdbcDataReader getItemsReader = getItemsCommand.ExecuteReader();
        OdbcCommand getDescriptionCommand = new OdbcCommand("SELECT ITEMDESCRIPTION FROM ITEMS WHERE ID = ?", databaseConnection);
        getDescriptionCommand.Prepare();
        while (getItemsReader.Read())
        {
            long id = getItemsReader.GetInt64(0);
            String outputPath = "c:\\text\\" + id + ".txt";
            if (!File.Exists(outputPath))
            {
                getDescriptionCommand.Parameters.Clear();
                getDescriptionCommand.Parameters.AddWithValue("id", id);
                String description = (String)getDescriptionCommand.ExecuteScalar();
                StreamWriter outputWriter = new StreamWriter(outputPath);
                outputWriter.Write(description);
                outputWriter.Close();
            }
        }
        getItemsReader.Close();

هذا الرمز بنجاح حفظ جزء من البيانات .ملفات txt, ولكن العديد من الصفوف ، AccessViolationException يتم طرح على السطر التالي:

                String description = (String)getDescriptionCommand.ExecuteScalar();

باستثناء النص "حاول قراءة أو كتابة الذاكرة المحمية.هذا هو في كثير من الأحيان إشارة إلى أن الذاكرة الأخرى تالفة".

البرنامج عادة رمي استثناء على نفس الصفوف من الجدول ، ولكن لا يبدو أن تكون متوافقة 100%.في بعض الأحيان البيانات التي ألقيت الاستثناء في الماضي فجأة في العمل.

بعض الناس مما لا شك فيه أتساءل لماذا لم SELECT ID, ITEMDESCRIPTION من العناصر في getItemsCommand و تخطي الاستعلام الثاني.في الحقيقة هذه الطريقة في البداية ، كنت تواجه نفس الخطأ مع getItemsCommand.GetString().كنت أخشى أنه ربما dataset كان تناول الكثير من الذاكرة و ربما كان ذلك تسبب في حدوث الخطأ.لذلك قررت أن تجرب هذه الطريقة لمعرفة إذا كان ذلك من شأنه أن يساعد.لم.لا أحد يعرف لماذا هذا يمكن أن يحدث ؟

بالمناسبة, ID INT ITEMDESCRIPTION هو VARCHAR(32000) عمود.إذا كان هناك فرق ، قاعدة بيانات Borland ينترباسي 6.0 (إك!)

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

تحديث: حلها.تحولت المشكلة إلى خطأ في برنامج تشغيل ODBC لدينا ليس موثوق بها برنامج قواعد البيانات.الحل مع السائقين الآخرين إصلاح المشكلة.

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

المحلول

ويمكن أن يكون خطأ في برنامج تشغيل ODBC الذي تستخدمه.ماذا السائق هو ؟ ما هي سلسلة الاتصال الخاصة بك?

نصائح أخرى

طلقة في الظلام هنا...

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

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