Question

J'ai une grande table (2.000.000 lignes) et je voudrais imprimer chaque enregistrement à l'écran, un à la fois, sans charger la table entière en mémoire.

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

}

Alors comme il est indiqué dans le code ci-dessus, le ExecuteReader () ne continue pas jusqu'à ce que l'ensemble est chargé en mémoire. Comment puis-je modifier ce comportement afin que les résultats sont transmis en continu?

Merci

ETA: Bien que cela semble devoir, ce n'est pas. Il est juste un moyen plus facile de décrire un problème qui implique la lecture d'une table entière avec une seule requête, mais le traitement des résultats d'une ligne à la fois.

ETA x2:

De Npgsql Attention: Il y a un problème connu lors de l'appel ExecuteReader et de grandes tables. Actuellement Version 1 de Npgsql obtient toutes les données de la table avant de retourner. Si vous rencontrez des mauvaises performances dans ce cas, vous devrez peut-être utiliser un curseur de serveur à la page par lignes. Pour cela, vous pouvez utiliser un code comme suit:

Était-ce utile?

La solution 2

Bon, eh bien, il ressemble à ceci est un problème connu avec Npgsql 1.0:

La solution consiste à utiliser un curseur de serveur:

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

Autres conseils

Npgsql2 gère maintenant beaucoup mieux grands résultats. Il ne se charge pas toutes les données en mémoire. Donc, vous n'avez pas besoin d'utiliser un curseur côté serveur plus.

J'espère que ça aide.

Francisco Figueiredo Jr. Npgsql Lead Developer

La façon de faire est plus facile:

COPY ( select * from Table) TO STDOUT

Vérifiez la syntaxe de copie pour voir comment l'imprimer en .csv ou tout autre format si vous devez ...

Pour imprimer toute la table avec le nom de la colonne et l'utilisation de la valeur code suivant:

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("====================");
                    }
                }
            }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top