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

質問
-
データベースに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となっています。よろしくお願いいたします。
回答
-
> 上記のような記述方法ではNpgsqlは使っているのですがEntityFrameworkではない(?)のではと思った次第です。
その通りで、Entity Framework は使っていません。
PostgreSQL + Npgsql + Entity Framework でストアドプロシージャを使えるかどうかは、PostgreSQL には触ったこともない自分には分かりません。
少しググって調べてみましたが、PostgreSQL + Npgsql で Entity Framework でストアドプロシージャを使う話は、stackoverflow などの質問にはあるものの解決できたという記事は見つからなかったです。諦めて質問者さんがやったように NpgsqlConnection, NpgsqlCommand を使って解決したという記事はありましたが・・・
お役に立てずすみませんが、他の回答者の回答をお待ちください。
しばらく待って回答がなければ、PostgreSQL のコミュニティで質問することをお勧めします。(その際はマルチポストにならないようご注意ください)
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2017年1月18日 8:22
- 回答としてマーク NanoSuzuGG 2017年1月31日 7:07
すべての返信
-
ググって調べただけですが、以下の記事の「関数呼び出し」のセクションが参考になりませんか?
Npgsql: ユーザマニュアル
https://www.postgresql.jp/document/NPGSQL/manual/UserManual_J.htmNpgsql stored procedure などをキーワードにググると他にも参考になりそうな記事がヒットすると思いますので、自分でもやってみましょう。
#PostgreSQL 製品の話は PostgreSQL のコミュニティで質問した方がよさそうです。(このフォーラムは Mocrosoft 製品に関する情報交換の場所だそうですので)
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2017年1月18日 8:22
-
ご回答ありがとうございました。
始めたばかりですのでよくわかっていませんが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ではない(?)のではと思った次第です。
色々調べて、対応していきたいと思いますがよろしくお願いいたします。
-
> 上記のような記述方法ではNpgsqlは使っているのですがEntityFrameworkではない(?)のではと思った次第です。
その通りで、Entity Framework は使っていません。
PostgreSQL + Npgsql + Entity Framework でストアドプロシージャを使えるかどうかは、PostgreSQL には触ったこともない自分には分かりません。
少しググって調べてみましたが、PostgreSQL + Npgsql で Entity Framework でストアドプロシージャを使う話は、stackoverflow などの質問にはあるものの解決できたという記事は見つからなかったです。諦めて質問者さんがやったように NpgsqlConnection, NpgsqlCommand を使って解決したという記事はありましたが・・・
お役に立てずすみませんが、他の回答者の回答をお待ちください。
しばらく待って回答がなければ、PostgreSQL のコミュニティで質問することをお勧めします。(その際はマルチポストにならないようご注意ください)
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2017年1月18日 8:22
- 回答としてマーク NanoSuzuGG 2017年1月31日 7:07