代码之家  ›  专栏  ›  技术社区  ›  Alan

NPGSQL:Postgres查询的流式处理结果?

  •  2
  • Alan  · 技术社区  · 16 年前

    我有一个很大的表(2000000行),我想将每条记录打印到屏幕上,一次打印一条,而不将整个表加载到内存中。

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

    因此,正如上面代码中所述,ExecuteReader()直到整个集合加载到内存中才会继续。如何更改此行为以使结果流式显示?

    谢谢

    埃塔:虽然这看起来像是家庭作业,但不是。这只是一种更简单的方法来描述一个问题,涉及到用一个查询读取整个表,但一次只处理一行结果。

    ETA x2:

    来自npgsql 警告:调用ExecuteReader和大型表时存在已知问题。

    4 回复  |  直到 16 年前
        1
  •  4
  •   Francisco Junior    16 年前

    Npgsql2现在可以更好地处理大型结果集。它不会将所有数据加载到内存中。因此,您不再需要使用服务器端游标。

    我希望有帮助。

    小弗朗西斯科·菲盖雷多。 Npgsql首席开发人员

        2
  •  2
  •   Alan    16 年前

    解决方法是使用服务器游标:

    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();
        }
      }
    }
    
        3
  •  0
  •   ntg    13 年前

    最简单的方法是:

    COPY ( select * from Table) TO STDOUT
    

    检查copy的语法,了解如何以.csv或任何其他格式打印它,如果需要。。。

        4
  •  0
  •   Vitali Korol    10 年前

    要使用列名和列值打印整个表,请使用以下代码:

    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("====================");
                        }
                    }
                }
    
    推荐文章