استثناء "نفاد الذاكرة" في CRecordset عند تحديد عمود LONGTEXT من MySQL

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

سؤال

أنا أستخدم CODBCRecordset (فئة موجودة في CodeProject) للعثور على سجل واحد في جدول يحتوي على 39 عمودًا.إذا لم يتم العثور على أي سجل فإن استدعاء CRecordset::Open يكون جيدًا.إذا كان السجل مطابقًا للشروط، فسأحصل على استثناء نفاد الذاكرة عند استدعاء CRecordset::Open.أقوم بتحديد جميع الأعمدة في الاستعلام (إذا قمت بتغيير الاستعلام لتحديد عمود واحد فقط بنفس عبارة المكان فلا يوجد استثناء).

أفترض أن هذا بسبب بعض القيود في CRecordset، لكن لا يمكنني العثور على أي شيء يخبرني بأي قيود.يحتوي الجدول على 39 عمودًا فقط.

هل واجه أحد هذه المشكلة؟وإذا كان الأمر كذلك، هل لديك حل/حل بديل؟

هذا مشروع MFC يستخدم Visual Studio 6.0 إذا كان يحدث أي فرق.

إليك الاستعلام (تم تنسيقه هنا حتى يظهر بدون شريط تمرير):

    SELECT `id`, `member_id`, `member_id_last_four`, `card_number`, `first_name`,
           `mi`, `last_name`, `participant_title_id`, `category_id`, `gender`, 
           `date_of_birth`, `address_line_1`, `address_line_2`, `city`, `state`, 
           `zip`, `phone`, `work_phone`, `mobile_phone`, `fax`, `email`, 
           `emergency_name`, `emergency_phone`, `job_title`, `mail_code`, 
           `comments`, `contract_unit`, `contract_length`, `start_date`, 
           `end_date`, `head_of_household`, `parent_id`, `added_by`, `im_active`, 
           `ct_active`, `organization`, `allow_members`, `organization_category_id`,  
           `modified_date` 
   FROM `participants` 
   WHERE `member_id` = '27F7D0982978B470C5CF94B1B833CC93F997EE23'

النسخ واللصق في متصفح الاستعلام الخاص بي يعطيني نتيجة واحدة فقط.

مزيد من المعلومات:

تم التعليق على كل عمود في عبارة التحديد باستثناء المعرف.ركض الاستعلام وليس استثناء.

ثم قمت بشكل منهجي بمراجعة كل عمود وعدم التعليق عليه، واحدًا تلو الآخر، وأعدت تشغيل الاستعلام بين كل تعليق.

عندما أقوم بإلغاء التعليق على عمود التعليق، أحصل على الخطأ.

يتم تعريف ذلك على النحو التالي (باستخدام MySQL):نص طويل

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

المحلول 3

اقرأ رد باكس.إنه يمنحك فهمًا رائعًا لسبب حدوث المشكلة.

العمل حول:

لن يحدث هذا الخطأ إلا إذا كان الحقل المحدد كـ (TEXT، LONGTEXT، إلخ) فارغًا (وربما فارغًا).إذا كانت هناك بيانات في الحقل، فسيتم تخصيص حجم البيانات الموجودة في الحقل فقط وليس الحجم الأقصى (مما يسبب الخطأ).

لذلك، إذا كانت هناك حالة يتعين عليك فيها الحصول على هذه الحقول الكبيرة.هنا هو الحل المحتمل:

  1. أعط الحقل قيمة افتراضية في قاعدة البيانات.(أي. '<blank>')
  2. ثم عند عرض القيمة؛قمت بتمرير NULL/فارغ إذا وجدت القيمة الافتراضية.
  3. ثم عند تحديث القيمة؛قمت بتمرير القيمة الافتراضية إذا وجدت NULL/فارغة.

نصائح أخرى

هل يمكننا أن نفترض أنك تعني أنك تتصل بـ Cأودبكمجموعة السجلات::Open()، نعم؟أو بشكل أدق شيء مثل:

CDatabase db;
db.Open (NULL,FALSE,FALSE,"ODBC;",TRUE);
CODBCRecordSet rs (&db);
rs.Open ("select blah, blah, blah from ...");

التعديل بعد الرد:

توجد بعض الأخطاء المعروفة في برامج تشغيل ODBC المتنوعة والتي يبدو أنها ناجمة عن استرداد أطوال الحقول غير الصالحة.انظر هذه الروابط:

يبدو أن السبب في ذلك هو أن CRecordset سيخصص مخزنًا مؤقتًا كبيرًا بما يكفي لاحتواء الحقل.نظرًا لأن العمود يُرجع طولًا يساوي صفرًا، فسيتم تفسيره على أنه الحد الأقصى لحجم 32 بت (~ 2G) بدلاً من الحد الأقصى لحجم 8 بت (255 بايت).وغني عن القول أنه لا يمكنه تخصيص ذاكرة كافية للحقل.

لقد أقرت Microsoft بأن هذه مشكلة، قم بإلقاء نظرة على الحلول التالية:

تحرير بعد إضافات الأسئلة:

لذا، نظرًا لأن حقل MySQL الخاص بك عبارة عن نص طويل، يبدو أن CRecordSet يحاول تخصيص أقصى حجم ممكن له (2G).هل تحتاج حقًا إلى 2 جيجا لحقل التعليقات؟الكتابة بسرعة 80 wpm، سيستغرق 6cpw كاتبًا ما يزيد قليلاً عن 7 سنوات لملء هذا الحقل، والعمل 24 ساعة في اليوم دون راحة :-).

قد يكون من المفيد إلقاء نظرة على جميع الأعمدة الموجودة في قاعدة البيانات الخاصة بك لمعرفة ما إذا كانت تحتوي على أنواع البيانات المناسبة.أنا لا أقول ذلك لك لا أستطيع لديك عمود 2G، فقط يجب أن تكون على يقين من أنه ضروري، خاصة في ضوء حقيقة أن فئات ODBC الحالية لن تعمل مع حقل بهذا الحجم.

وI الثانية اقتراح باكس على أن هذا الخطأ يرجع إلى محاولة تخصيص منطقة عازلة كبيرة بما يكفي لاحتواء أكبر LONGTEXT ممكن. العميل لا يعرف مدى ضخامة البيانات حتى جلب عليه ذلك.

وLONGTEXT هو في الواقع أكبر من وسيلة كنت في حاجة من أي وقت مضى في معظم التطبيقات. النظر في استخدام MEDIUMTEXT (أقصى حجم 16MB) أو TEXT عادل (ماكس حجم 64KB) بدلا من ذلك.

وهناك مشاكل مماثلة في واجهات قاعدة بيانات PHP. A PHP لديه عادة الحد الأقصى لحجم الذاكرة وأي جلب من LONGBLOB أو LONGTEXT من المرجح أن يتجاوز ذلك الحد.

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