ホーム > コンピュータ > DataBase > PostgresSQL > Npgsql

refcursorsを使用して、DataSetオブジェクトで完全な結果を取得します:[Npgsqlドキュメント]

作成日 2015.03.06
最終更新日 2015.03.06

概要

PostgreSQLデータベース・サーバのための、.NET データ・プロバイダNpgsqlのドキュメント(2014年7月25日・13改訂版)の和訳です。 旧版ドキュメント(外部サイト) の和訳は存在しましたが、現行版のドキュメントのものは見つからなかったので和訳しました。 PostgreSQLとC#の両方を学ぶための資料集めの一環としての作成しています。

原文

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は、正しくあなたのパラメータの結合を処理します。

inserted by FC2 system