概要
原文
npgsqlマニュアル(2014年7月25日・13改訂版)(外部サイト)
公式ページのドキュメントです。英語で書かれています。
refcursorsを使用して、DataSetオブジェクトで完全な結果を取得します:
Getting full results in a DataSet object: Using refcursors
Refcursorsは、クライアントに大規模な結果セットを返す、Postgresで関数を構築するための最も強力な方法の1つです。 refcursorsを使用して、一つの関数は、複数の問合せの結果を、1回の往復旅行で、クライアントに返すことができます。 ほとんどのNpgsql開発者は、一旦、あなたが基本的な構文を把握すれば、refcursorsが非常に使いやすいことを学ぶでしょう。
このサンプルは、refcursorsを使用している関数から、2つの結果セットを返します。 Npgsqlの一様な参照カーソルのサポートで、あなたは、Postgresの中の参照カーソルの内部動作について気にすることなく、 多くの結果セットを取得することができます。
次に示す、参照カーソルに基づく関数について考えてください。
CREATE OR REPLACE FUNCTION testrefcursor(int4) RETURNS SETOF refcursor AS
'DECLARE
ref1 refcursor;
ref2 refcursor;
ref3 refcursor;
BEGIN
OPEN ref1 FOR
SELECT * FROM table1;
RETURN NEXT ref1;
OPEN ref2 FOR
SELECT * FROM table2;
RETURN next ref2;
OPEN ref3 FOR EXECUTE
'SELECT * FROM table3 WHERE keyfield = ' || $1;
RETURN next ref3;
RETURN;
END;'
LANGUAGE plpgsql;
この関数は、3つのselect文の完全な結果を返します。最後のselect文がサーバで動的に作成されることに注意します。
今、あなたは、DataReaderを使用して、これらの関数を呼び出し、データを取り出すために、以下コードを使用します。:
using System;
using System.Data;
using Npgsql;
using NpgsqlTypes;
public class c
{
public static void Main(String[] args)
{
NpgsqlConnection conn = new NpgsqlConnection
("Server=127.0.0.1;Initial Catalog=eeeeee;User id=npgsql_tests;password=npgsql_tests;");
conn.Open();
NpgsqlTransaction t = conn.BeginTransaction();
NpgsqlCommand command = new NpgsqlCommand("testrefcursor", conn);
command.CommandType = CommandType.StoredProcedure;
NpgsqlDataReader dr = command.ExecuteReader();
while(dr.Read())
Console.WriteLine(dr.GetValue(0));
dr.NextResult();
while(dr.Read())
Console.WriteLine(dr.GetValue(0));
dr.Close();
t.Commit();
conn.Close();
}
}
他の方法として、あなたは、DataSetオブジェクトに、結果を取り出すことができます。:
using System;
using System.Data;
using Npgsql;
using NpgsqlTypes;
public class c
{
public static void Main(String[] args)
{
DataSet myDS;
NpgsqlConnection conn = new NpgsqlConnection
("Server=127.0.0.1;Initial Catalog=eeeeee;User id=npgsql_tests;password=npgsql_tests;");
conn.Open();
NpgsqlTransaction t = conn.BeginTransaction();
NpgsqlCommand command = new NpgsqlCommand("testrefcursor", conn);
command.CommandType = CommandType.StoredProcedure;
con.Open();
NpgsqlDataAdapter da = new NpgsqlDataAdapter(command);
da.Fill(myDS);
t.Commit();
conn.Close();
}
}
それで、おしまい!.注目に値する最後の一つは、あなたが、この作業を行うために、トランザクションを使う必要があります。 これは、暗黙のトランザクションが完了した後、参照カーソルの関数によって返されるカーソルを妨げるために必要です。 (あなたが、関数呼び出しを行う直後に)。あなたが、関数にパラメータを持っている場合、いつも通りに、CommandTextプロパティに関数の名前を割り当て、 NpgsqlCommand.Parametersコレクションにパラメータを追加します。Npgsqlは、正しくあなたのパラメータの結合を処理します。