Pregunta

Tengo una tabla grande (2.000.000 filas) y me gustaría imprimir cada registro a la pantalla, de uno en uno, sin tener que cargar toda la tabla en la memoria.

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

}

Así como se indica en el código anterior, la ExecuteReader () no continúa hasta que todo el conjunto se carga en memoria. ¿Cómo puedo cambiar este comportamiento por lo que los resultados se transmiten?

Gracias

ETA: Aunque esto parece tarea, no lo es. Es sólo una manera más fácil para describir un problema que implica la lectura de una tabla completa con una sola consulta, pero el procesamiento de los resultados de una fila a la vez.

ETA x2:

De Npgsql Advertencia: Hay un problema conocido cuando se llama a ExecuteReader y grandes mesas. Actualmente Versión 1 de Npgsql obtiene todos los datos de la tabla antes de regresar. Si usted está experimentando un mal desempeño en tales casos, puede que tenga que utilizar un cursor de servidor a través de la página filas. Para ello, se puede utilizar un código como el siguiente:

¿Fue útil?

Solución 2

Bueno, Bueno, parece que esto es un problema conocido con Npgsql 1.0:

La solución es utilizar un cursor de servidor:

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

Otros consejos

Npgsql2 ahora maneja grandes conjuntos de resultados mucho mejores. No se carga todos los datos en la memoria. Por lo tanto, no es necesario utilizar un cursor del lado del servidor más.

espero que ayude.

Francisco Figueiredo Jr. Npgsql desarrollador jefe

La forma más sencilla de hacer esto es:

COPY ( select * from Table) TO STDOUT

Compruebe la sintaxis de copia para ver cómo imprimirlo en .csv o cualquier otro formato si es necesario ...

Para imprimir toda la tabla con el nombre de la columna y el uso valor siguiente código:

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("====================");
                    }
                }
            }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top