سؤال

لدي طاولة كبيرة (2،000،000 صف) وأرغب في طباعة كل سجل على الشاشة، واحدة في الوقت المناسب، دون تحميل الجدول بأكمله في الذاكرة.

//pseudo code
var cmd = new NpgSQLCommand();
cmd.CommandText = "SELECT * FROM mytable;"
IReader reader = cmd.ExecuteReader(); //blocks until the entire set is returned

while(reader.Read()) //ideally each call to read loads more results from the db.
{
// print record name

}

كما لوحظ في التعليمات البرمجية أعلاه، لا يستمر ExecuteReadeDer () حتى يتم تحميل المجموعة بأكملها في الذاكرة. كيف يمكنني تغيير هذا السلوك حتى يتم بث النتائج؟

شكرا

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

ETA X2:

من تحذير NPGSQL: هناك مشكلة معروفة عند استدعاء ExecuteReader وجداول كبيرة. حاليا الإصدار 1 من NPGSQL يحصل على جميع البيانات من الجدول قبل العودة. إذا كنت تعاني من الأداء السيئ في مثل هذه الحالات، فقد تحتاج إلى استخدام مؤشر الخادم إلى الصفحة من خلال الصفوف. لذلك، يمكنك استخدام رمز مثل ما يلي:

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

المحلول 2

حسنا، حسنا، يبدو أن هذه مشكلة معروفة مع NPGSQL 1.0:

الحل البديل هو استخدام مؤشر الخادم:

using System;
using System.Data;
using Npgsql;

public static class NpgsqlUserManual
{
  public static void Main(String[] args)
  {
    NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=joe;Password=secret;Database=joedata;");
    conn.Open();

    NpgsqlCommand command = new NpgsqlCommand("select version()", conn);
    String serverversion;

    try
    {
      serverversion = (String)command.ExecuteScalar();
      Console.WriteLine("PostgreSQL server version: {0}", serverversion);
    }


    finally
    {
      conn.Close();
    }
  }
}

نصائح أخرى

NPGSQL2 يتصنع الآن نتائج كبيرة أفضل بكثير. لا يقوم بتحميل جميع البيانات إلى الذاكرة. لذلك، لا تحتاج إلى استخدام مؤشر جانبي الخادم بعد الآن.

اتمني ان يكون مفيدا.

Francisco FigueIrdo Jr. NPGSQL الرصاص المطور

أسهل طريقة للقيام بذلك هي:

COPY ( select * from Table) TO STDOUT

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

لطباعة جدول كامل مع اسم العمود واستخدام القيمة التالية

using (var conn = new NpgsqlConnection("Host=IPADDRESS;Username=USER;Password=PASS;Database=DBNAME;"))
        {
            conn.Open();
            using (var cmd = new NpgsqlCommand())
            {
                cmd.Connection = conn;

                cmd.CommandText = "SELECT * FROM TABLE_NAME";

                StringBuilder str;
                int count;

                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        str = new StringBuilder();
                        count = 0;

                        while (count < reader.FieldCount) {
                            str.Append(reader.GetName(count) + ": " + reader.GetValue(count));

                            if ((count + 1) < reader.FieldCount)
                            {
                                str.Append(", ");
                            }

                            count++;
                        }

                        Console.WriteLine(str.ToString());
                        Console.WriteLine("====================");
                    }
                }
            }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top