문제

큰 테이블 (2,000,000 행)이 있으며 전체 테이블을 메모리에로드하지 않고 각 레코드를 한 번에 화면에 인쇄하고 싶습니다.

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

좋아, 이것은 NPGSQL 1.0에서 알려진 문제 인 것 같습니다.

해결 방법은 서버 커서를 사용하는 것입니다.

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는 이제 큰 결과 세트를 훨씬 더 잘 처리합니다. 모든 데이터를 메모리에로드하지는 않습니다. 따라서 더 이상 서버 측 커서를 사용할 필요가 없습니다.

도움이되기를 바랍니다.

Francisco Figueiredo Jr. 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