Frage

Ich habe eine große Tabelle (2.000.000 Zeilen) und ich möchte jeden Datensatz auf dem Bildschirm drucken, eine zum Zeitpunkt, ohne die gesamte Tabelle in den Speicher geladen werden.

//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

}

So wie oben in dem Code angegeben, der ExecuteReader () wird nicht fortgesetzt, bis die gesamte Menge in dem Speicher geladen wird. Wie kann ich dieses Verhalten ändern, so dass die Ergebnisse gestreamt werden?

Danke

ETA: Während dies wie Hausaufgaben scheint, ist es nicht. Es ist nur ein einfacher Weg, um ein Problem zu beschreiben, die mit einer einzigen Abfrage eine ganze Tabelle beinhaltet das Lese aber Verarbeitung der Ergebnisse eine Zeile zu einem Zeitpunkt.

ETA x2:

Von Npgsql Achtung: Es ist ein bekanntes Problem, wenn ExecuteReader und große Tabellen aufrufen. Aktuell Version 1 von Npgsql erhält alle Daten aus der Tabelle vor der Rückkehr. Wenn Sie schlechte Leistung in solchen Fällen auftreten, müssen Sie möglicherweise einen Server-Cursor, um durch Reihen verwenden. Dafür können Sie einen Code wie folgt verwendet werden:

War es hilfreich?

Lösung 2

Okay, gut sieht es aus wie das ist ein bekanntes Problem mit Npgsql 1.0:

Die Abhilfe ist ein Server-Cursor zu verwenden:

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();
    }
  }
}

Andere Tipps

Npgsql2 Griffe jetzt große Result viel besser. Es werden nicht alle Daten in den Speicher laden. Also, Sie müssen nicht mehr einen Server-Cursor verwenden.

Ich hoffe, es hilft.

Francisco Figueiredo Jr. Npgsql Lead Developer

Der einfachste Weg, dies zu tun ist:

COPY ( select * from Table) TO STDOUT

Überprüfen Sie die Syntax der Kopie zu sehen, wie es in CSV- oder einem anderen Format zu drucken, wenn Sie benötigen ...

aus der gesamten Tabelle mit Spaltennamen und Wert Verwendung folgendem Code drucken:

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("====================");
                    }
                }
            }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top