我有一个大表(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:虽然这看起来像功课,事实并非如此。这只是一个简单的方法来描述包括读取整个表单查询,但在同一时间处理结果行中的问题。

ETA X2:

从Npgsql的 警告:调用的ExecuteReader和大表时有一个已知的问题。 <击>目前的Npgsql的版本1返回之前,会从表中的所有数据。如果您遇到在这种情况下糟糕的表现,可能需要通过行使用服务器游标页。为此,可以使用如下所示的代码:

有帮助吗?

解决方案 2

好的,那么它看起来这是一个已知问题1.0 Npgsql的:

在解决方法是使用一个服务器光标:

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现在可以处理大型结果集好得多。它不会将所有的数据加载到内存中。所以,你不需要使用服务器端游标了。

我希望它能帮助。

旧金山菲格雷小 铅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