سؤال

أحصل على شيء غريب جدًا يحدث عند محاولة قراءة بعض البيانات باستخدام موصل MySql .net.إليك الكود:

IDataReader reader = null;

using (MySqlConnection connection = new MySqlConnection(this.ConnectionString))
{
    String getSearch = "select * from organization";
    MySqlCommand cmd = new MySqlCommand(getSearch, connection);
    cmd.CommandType = CommandType.Text;

    connection.Open();
    reader = cmd.ExecuteReader();

    while (reader.Read())
    {
        // response write some stuff to the screen (snipped for brevity)
    }
}

إذا قمت بوضع نقطة توقف بعد ExecuteReader وقمت بتوسيع عرض النتائج في Visual Studio (بالتمرير فوق القارئ والتوسيع)، فيمكنني رؤية الصفوف التي يتم إرجاعها بواسطة الاستعلام.إذا قمت بعد ذلك بإغلاق ذلك وتوسيع عرض النتائج مرة أخرى، فستظهر لي الرسالة "لم يسفر التعداد عن أي نتائج".

يبدو كما لو أن محتويات القارئ تتم إعادة ضبطها بمجرد مشاهدتها.

وأما ما جربناه:
- يعمل SQL بشكل جيد مباشرة على قاعدة البيانات
- ربط نتائج الاستعلام مباشرة بشبكة بيانات يؤدي فقط إلى إرجاع شبكة بيانات فارغة
- حصلت على أحدث نسخة من موصل .net
- تمت تجربته على جهازين مختلفين لاستبعاد أي أخطاء محلية

حتى الآن لم ينجح شيء.

إذا كان بإمكان أي شخص تقديم أي أفكار أو اقتراحات فسيكون موضع تقدير كبير.

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

المحلول

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

  1. أعد تنفيذ الاستعلام لإنشاء SqlDataReader آخر عند الحاجة

  2. بدلاً من استخدام SqlDataReader، قم بتخزين نتائج استعلامك الأصلي في System.Data.DataTable، حيث يمكنك بعد ذلك إعادة قراءة البيانات ومعالجتها كيفما تشاء.

أتمنى أن يساعدك هذا!

آدم

نصائح أخرى

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

والمفتاح هو أن الاتصال يجب أن تكون مفتوحة، عند محاولة قراءة من القارئ.

هنا هو التوضيح:

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

عليك فقط تشغيل مرة أخرى cmd.ExecuteReader(); السطر (عن طريق النقر بزر الماوس الأيمن في المصدر واستخدام خيار قائمة "SET NEXT THELD").

هذا هو سلوك قراء البيانات.إذا كنت قد قمت بالفعل بتكرار ذلك، فلن تتمكن من العودة.يجب عليك تنفيذ الأمر مرة أخرى واسترداد أمر جديد.

إذا كنت بحاجة إلى استخدام بياناتك بعد إغلاق القارئ، فقد تختار استخدام ملف Typed DataSet, ، أو غير مكتوب DataSet كما هو محدد في آدم إجابة.

بالمناسبة، وهنا بعض optimizations يمكنك صنع:

  • حرك القارئ داخلConnection باستخدام كتلة لجعلها خارج نطاقها بعد الانتهاء من استخدامه (بمجرد خروجك من الكتلة ، سيتم إغلاق الاتصال ولن تتمكن من استخدامه على أي حال ، لذلك ليس من المنطقي تركه في الخارج)
  • يجري ExecuteReader في آخر using كتلة (كما تنفذ IDisposable) وتفعل الشيء نفسه مع Sql Command (نفس الشيء IDisposable واجهه المستخدم)
  • لا تسترجع جميع الحقول من قاعدة البيانات
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top