none
ストアドプロシージャ(ファンクション)の呼び出し方法について RRS feed

  • 質問

  • データベースにPostgreSQLを使用しています。

    以下のようなファンクション(ストアドプロシージャ)を作成いたしました。

    これをWPFフォーム上のボタンに割り付けて呼び出したいのですがその方法がわからず質問させていただきます。

    CREATE OR REPLACE FUNCTION sp_calendar_upd(rhiduke DATE, rflag INTEGER) 
    RETURNS BOOLEAN AS $$
    DECLARE
        dcnt INTEGER;
    BEGIN
        SELECT INTO dcnt count(*) FROM aitd_calendar WHERE kadoubi = rhiduke;
        CASE rflag
            WHEN 0 THEN
                If dcnt != 1 then
                    INSERT INTO aitd_calendar VALUES(rhiduke);
                End If;
            ELSE
                If dcnt >= 1 then
                    DELETE FROM aitd_calendar WHERE kadoubi = rhiduke;
                End If;
        END CASE;
        RETURN TRUE;
    EXCEPTION WHEN unique_violation THEN
      RETURN FALSE;
    END;
    $$ LANGUAGE PLpgSQL;
    

    このファンクション(ストアドプロシージャ)は2つの引数をとり、『稼働日』のボタンをクリックすると日付と0を引数とし、その日付の存在を確認してなければ登録、『非稼働日』のボタンをクリックすると日付と1を引数とし、その日付があれば削除します。pgAdmin上で動かすと問題なく動作いたします。

    EntityFrameworkとPostgreSQLを使用するためNpgsqlをNuGETでセットアップしました。

    環境はWindows10、VisualStudio2015となっています。よろしくお願いいたします。

    2017年1月16日 1:14

回答

  • > 上記のような記述方法ではNpgsqlは使っているのですがEntityFrameworkではない(?)のではと思った次第です。

    その通りで、Entity Framework は使っていません。

    PostgreSQL + Npgsql + Entity Framework でストアドプロシージャを使えるかどうかは、PostgreSQL には触ったこともない自分には分かりません。

    少しググって調べてみましたが、PostgreSQL + Npgsql で Entity Framework でストアドプロシージャを使う話は、stackoverflow などの質問にはあるものの解決できたという記事は見つからなかったです。諦めて質問者さんがやったように NpgsqlConnection, NpgsqlCommand を使って解決したという記事はありましたが・・・

    お役に立てずすみませんが、他の回答者の回答をお待ちください。

    しばらく待って回答がなければ、PostgreSQL のコミュニティで質問することをお勧めします。(その際はマルチポストにならないようご注意ください)

    2017年1月17日 8:22

すべての返信

  • ググって調べただけですが、以下の記事の「関数呼び出し」のセクションが参考になりませんか?

    Npgsql: ユーザマニュアル
    https://www.postgresql.jp/document/NPGSQL/manual/UserManual_J.htm

    Npgsql stored procedure などをキーワードにググると他にも参考になりそうな記事がヒットすると思いますので、自分でもやってみましょう。

    #PostgreSQL 製品の話は PostgreSQL のコミュニティで質問した方がよさそうです。(このフォーラムは Mocrosoft 製品に関する情報交換の場所だそうですので)

    2017年1月16日 1:45
  • ご回答ありがとうございました。

    始めたばかりですのでよくわかっていませんがEntityFrameworkを使ってのファンクション(ストアドプロシージャ)の呼び出し方法を探していまして、結局たどり着かずの質問となったわけですが今後は気を付けたいと思います。

    とりあえず動作させるということで以下のようにいたしました。

            #region 稼働日ボタンクリック時処理
            private void btnKadou_Click(object sender, RoutedEventArgs e)
            {
                // 選択された値が日付として認識できるか確認
                DateTime rHiduke;
                if (DateTime.TryParse(Calendar.SelectedValue.ToString(), out rHiduke))
                {
                    NpgsqlConnection conn = new NpgsqlConnection(clsConst.connString);
                    conn.Open();
                    try
                    {
                        using (var command = conn.CreateCommand())
                        {
                            command.CommandText = "sp_calendar_upd";
                            command.CommandType = CommandType.StoredProcedure;
                            command.Parameters.Add(new NpgsqlParameter());
                            command.Parameters[0].NpgsqlDbType = NpgsqlDbType.Date;
                            command.Parameters[0].Value = rHiduke;
                            command.Parameters.Add(new NpgsqlParameter());
                            command.Parameters[1].NpgsqlDbType = NpgsqlDbType.Integer;
                            command.Parameters[1].Value = 0;
                            // ファンクション実行
                            var result = command.ExecuteScalar();
                        }
                        // カレンダーへの日付設定
                        dtpCalen.Value = rHiduke;
                        //Calendar.DataContext = dtpCalen.Value;
                    }
                    finally
                    {
                        conn.Close();
                    }
                }
            }
            #endregion
    

    上記のような記述方法ではNpgsqlは使っているのですがEntityFrameworkではない(?)のではと思った次第です。

    色々調べて、対応していきたいと思いますがよろしくお願いいたします。


    2017年1月17日 6:44
  • > 上記のような記述方法ではNpgsqlは使っているのですがEntityFrameworkではない(?)のではと思った次第です。

    その通りで、Entity Framework は使っていません。

    PostgreSQL + Npgsql + Entity Framework でストアドプロシージャを使えるかどうかは、PostgreSQL には触ったこともない自分には分かりません。

    少しググって調べてみましたが、PostgreSQL + Npgsql で Entity Framework でストアドプロシージャを使う話は、stackoverflow などの質問にはあるものの解決できたという記事は見つからなかったです。諦めて質問者さんがやったように NpgsqlConnection, NpgsqlCommand を使って解決したという記事はありましたが・・・

    お役に立てずすみませんが、他の回答者の回答をお待ちください。

    しばらく待って回答がなければ、PostgreSQL のコミュニティで質問することをお勧めします。(その際はマルチポストにならないようご注意ください)

    2017年1月17日 8:22
  • わざわざ調べていただきありがとうございました。

    当方でも多少調べてみましたが『DotConnect』という有償のツールを使用するとEntityFrameworkでの接続や操作を実現できそうです。

    ストアドプロシージャは結構利用するほうですので方法がなければそのようなツールも致し方ないとは思いますがConnectionとCommandでとりあえず可能ということでしたのでこれはこれとして先に進みたいと思います。

    ありがとうございました。

    2017年1月31日 7:15