作成日 2015.03.06
最終更新日 2015.03.06
概要
PostgreSQLデータベース・サーバのための、.NET データ・プロバイダNpgsqlのドキュメント(2014年7月25日・13改訂版)の和訳です。
旧版ドキュメント(外部サイト)
の和訳は存在しましたが、現行版のドキュメントのものは見つからなかったので和訳しました。
PostgreSQLとC#の両方を学ぶための資料集めの一環としての作成しています。
原文
npgsqlマニュアル(2014年7月25日・13改訂版)(外部サイト)
公式ページのドキュメントです。英語で書かれています。
テーブルや選択から大量のデータを素早くコピーする
Fast bulk data copy from a table or select
ネットワークがボトルネックであるとき、大規模なデータ・セットのありふれた選択でさえ、時間がかかるようになることがあます。 PostgreSQLは、未加工のデータをエクスポートする、より速いメソッドの選択肢を提供します。 その構文と入力フォーマットの選択肢は、PostgreSQL Copyのドキュメントで、すでに説明されます。 クライアント側へデータをコピーするために、あなたは、TO STDOUTオプションを使用する必要があります。
COPY OUTは、サーバー側のエンコードでデータを提供します。
最も簡単なメソッドは、CopyOut操作コンストラクタに、書き込み可能なストリームを提供することです。 開始すると、操作は、続いて、適切なサーバから受信側に降りてくるすべてを書き込むでしょう。 (異なる出力フォーマットのためのCOPY文のドキュメントを参照してください!)
- データベースから受け取った出力を書き込むために、ストリームを持つNpgsqCopyOutオブジェクトを作成します。
- コピー操作を開始するために、Start()を呼び出します。すべての要求されたデータは、すぐに指定されたストリームに書き込まれます。
- CopyStream.Close()やNpgsqlCopyIn.End()を呼び出すことによって、進行中の操作は取り消される可能性があります。
- 失敗すると、あなたが、コピー操作を取り消さない限り、あなたの接続は使えなくなります。
- Start()が、例外を投げる場合、進行中の操作を取り消します。 そうでなければ、あなたの接続は、他の何かのために使えない、コピー・モードでとどまる可能性があります。
using System;
using System.Data;
using Npgsql;
public class CopyOutExample
{
public static void Main(String[] args)
{
conn = new NpgsqlConnection("Server=127.0.0.1;User id=npgsql_tests;password=npgsql_tests;");
conn.Open();
NpgsqlCommand command = new NpgsqlCommand("COPY myCopyTestTable TO STDOUT", conn);
NpgsqlCopyOut cout = new NpgsqlCopyOut( command, conn, Console.OpenStandardOutput() );
try
{
cout.Start();
}
catch(Exception e)
{
try
{
cout.End(); // return connection to Ready for Query state
// Query状態のためのReadyに接続を返します
}
catch(Exception e2)
{
throw new Exception("Failed to revive from copy: " + e2 + " upon failure: " + e);
}
throw e;
}
}
}
あなたは、ストリームから、正常に、COPY OUTデータを読むことができます。:
- ストリームを指定せずに、NpgsqCopyOutオブジェクトを作成します。
- コピー操作を開始するために、Start()を呼び出します。
- NpgsqlCopyOut.CopyStreamからサーバー側のエンコーディングを、 あるいは、NpgsqlCopyOut.Readから行ごとにデータを読込みます。
- 操作中、接続は他に何かのために使用することができないかもしれません。
- これ以上、出て来ないとき、すべてのデータは受け取られました。 (CopyStream.Read(...) returns zero; NpgsqlCopyOut.Read a null pointer )
- 操作が終了すると自動的に完了します。
- CopyStream.Close()やNpgsqlCopyIn.End()を呼び出すことによって、 進行中の操作は取り消される可能性があります。
- 失敗すると、進行中の操作を取り消します。それ以外の場合には、 あなたの接続は、他の何かのために使えないコピー・モードでとどまる可能性があります。
using System;
using System.Data;
using Npgsql;
public class CopyOutExample
{
public static void Main(String[] args)
{
conn = new NpgsqlConnection("Server=127.0.0.1;User id=npgsql_tests;password=npgsql_tests;");
conn.Open();
NpgsqlCommand command = new NpgsqlCommand("COPY myCopyTestTable TO STDOUT", conn);
NpgsqlCopyOut cout = new NpgsqlCopyOut( command, conn );
Stream outStream = Console.OpenStandardOutput();
Encoding serverEncoding = System.Text.Encoding.BigEndianUnicode; // example assumption
Encoding outEncoding = System.Text.Encoding.ASCII;
try
{
cout.Start();
Stream copyOutStream = cout.CopyStream;
byte[] buf = cout.Read; // complete first row
//最初の行を完成します
Console.Out.Write(buf,0,buf.Length);
int i;
while( (i = copyOutStream.Read(buf,0,buf.Length)) > 0 )
{
buf = System.Text.Convert( serverEncoding, outEncoding, buf, 0, i );
Console.Out.Write( buf, 0, i );
}
copyOutStream.Close(); // or cout.End(), if you wish
//あなたが、望む場合、
}
catch(Exception e)
{
try
{
cout.End(); // return connection to Ready for Query state
// Query状態のためのReadyに接続を返します
}
catch(Exception e2)
{
throw new Exception("Failed to revive from copy: " + e2 + " upon failure: " + e);
}
throw e;
}
}
}