كيفية إرجاع MySqlDataReader قبل إغلاق القارئ [نسخة مكررة]

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

  •  11-12-2019
  •  | 
  •  

سؤال

حسنًا، الكود الخاص بي حاليًا هو:

    public MySqlDataReader CreateQuery(string queryString, string connectionString )
    {

        using (MySqlConnection connection = new MySqlConnection(connectionString))
        {
            using (MySqlCommand command = new MySqlCommand(queryString, connection))
            {
                command.Connection.Open();
                command.ExecuteNonQuery();

                MySqlDataReader reader = command.ExecuteReader();
                return reader;
            }
        }
    }

في وظيفة أخرى، لقد حصلت على:

using(MySqlDataReader readers = _connection.CreateQuery(query, connectString))

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

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

المحلول

باستخدام أمر الاستخدام، سيتخلص الكود الخاص بك فعليًا من الاتصال والأمر قبل إعادة التحكم إلى المتصل.بشكل أساسي، يتم التخلص من كائن الاتصال الخاص بك وكائن الأمر الذي تم إنشاؤه في عبارات الاستخدام قبل أن يتمكن رمز الاتصال من استخدامه، لذلك لم يعد قابلاً للاستخدام.

ربما تريد أن تفعل شيئًا ما بنتائج الاستعلام بدلاً من القارئ نفسه.ربما تحميله في الجدول؟شيء مثل:

public DataTable CreateQuery(string queryString, string connectionString )
    {
        DataTable results =  new DataTable("Results");
        using (MySqlConnection connection = new MySqlConnection(connectionString))
        {
            using (MySqlCommand command = new MySqlCommand(queryString, connection))
            {
                command.Connection.Open();
                command.ExecuteNonQuery();

                using (MySqlDataReader reader = command.ExecuteReader())
                    results.Load(reader);
            }
        }
       return results;
    }

نصائح أخرى

بدلاً من إرجاع Datareader أو نسخ كافة السجلات إلى الذاكرة DataTable التي يمكنك إعادتها ككل، يمكنك إرجاع IEnumerable<IDataRecord> وهي الواجهة الأساسية أ DataReader ينفذ سجل.

لذلك يجب أن يعمل هذا منذ yield يسبب Connection للبقاء على قيد الحياة:

public IEnumerable<IDataRecord> CreateQuery(string queryString, string connectionString)
{
    using (MySqlConnection connection = new MySqlConnection(connectionString))
    {
        using (MySqlCommand command = new MySqlCommand(queryString, connection))
        {
            command.Connection.Open();
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    yield return (IDataRecord)reader;
                }
            }
         }
    }
}

إذا كنت تريد على سبيل المثال، خذ السجلات الخمسة الأولى فقط:

var records = CreateQuery("SELECT * FROM ais.country;", Properties.Settings.Default.MySQL).Take(5);
foreach (IDataRecord rec in records)
{
    String country = rec.GetString(rec.GetOrdinal("Name"));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top