Visual Studio Express 2012 for Web でいってみる 11.ストアドプロシジャを使ってみる(3/6)
前回からの続きです。
№3.コントローラをストアドプロシジャ呼び出しをおこなうように変更(前篇)。
さて、Model系が用意できたので、次にコントローラーの変更を行います。ただ、このままコントローラに手を入れて行くとスクリプトが見にくくなる予感がします。別ファイル(Repository)を用意、そちらに手続きを記述してコントローラーをすっきりさせようと思います。
1.Repository用のフォルダ[Repositories]を作成する。
[Models]フォルダの配下に[Repositories]フォルダを追加します。
[Models]フォルダを右クリック、リストから[追加]を選択、引き続きリストから[新しいフォルダ]を選択し出来上がったフォルダ名を、なんでもいいけど[Repositories]としておきましょう。
2.[Repositories]フォルダにクラスファイル[CarrierRepository.cs]を作成する。
[Repositories]フォルダを選択右クリックして、リストから[追加]を選択、引き続きリストから[新しい項目]を選択。[新しい項目の追加]ダイアログが表示されます。
テンプレートの指定は、[コード] -> [クラス]を選択し、名前を[CarrierRepository.cs]とし(名前は任意です)、[追加]をクリックします。
こんなスクリプトが生成されます。
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Mvc4ApplicationE.Models.Repositories { public class CarrierRepository { } }
このスクリプトに手を加えていきます。
3.[CarrierRepository.cs]にメソッドとインターフェースを追加する。
先に出来上がり状態のスクリプトです。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Objects; //ストアドプロシジャのパラメータで必要 namespace Mvc4ApplicationD.Models.Repositories { // リポジトリ インターフェース public interface ICarrierRepository { //運送会社一覧の作成用 IEnumerable GetCarriersList(int? CarrierCDMIN, int? CarrierCDMAX, out int DataCount); } // end of interace public class CarrierRepository : ICarrierRepository { //Northwind データベースコンテキストを用意する private NorthwindJEntities db = new NorthwindJEntities(); // 表示用運送会社一覧を作成 public IEnumerable GetCarriersList(int? CarrierCDMIN, int? CarrierCDMAX, out int DataCount) { //input parameter 運送コードの範囲指定用 CarrierCDMIN = CarrierCDMIN != null ? CarrierCDMIN : 0; //nullだったら 0をセット CarrierCDMAX = CarrierCDMAX != null ? CarrierCDMAX : 999;//nullだったら 999をセット //output parameter の指定 //ここのパラメータ名はストアドプロシジャと一致させること。日本語はつかえないみたい。 ObjectParameter dataCount = new ObjectParameter("po_DataCount", typeof(int)); //IListのインスタンスを生成 IList model = new List(); //ストアドプロシジャ SP_GetCarriers1を呼び出し受け取ったデータより model にセットして行く //NorthwindJ.Context.cs の メソッドSP_GetCarriers1を参照 foreach (SP_GetCarriers1_Result 運送会社 in db.SP_GetCarriers1(CarrierCDMIN, CarrierCDMAX, dataCount)) { //明示的に変換しmodelに追加します。 var item = new 運送会社ViewModel(); item.運送コード = 運送会社.運送コード; item.運送会社1 = 運送会社.運送会社; item.電話番号 = 運送会社.電話番号; model.Add(item); } //ストアドプロシジャのOUTPUTパラメータの値を引数にセット //データセットを返すストアドプロシジャのOUTPUTパラメータの値は //データセットの読み取り終了後でないと取得できない。 DataCount = (int)dataCount.Value; //出来上がったmodelを返しておしまい。 return model; } } }
小さくてごめんなさい。
パラメータを使うストアドプロシジャなのでusing に System.Data.Objectsを追加
あとまだ詳細は理解できてないけど、いろんなサンプルで見かける「インターフェース」部を追加してます。単体テストとか何かとご利益があるような気がします。
メソッド部は、ご覧のとおり以前はコントロールに置いていたデータの取得部分とほぼ同じですね。
foreachの部分、以前はエンティティからTolistでデータをもってきてましたが、そこをストアドプロシジャ呼び出しからの取得に変えています。
あと、OUTPUTパラの値の取り出しについては、foreachによるデータの取り出しが完了するまでは(パラの値はnullになってる)できないようです。
次回は[運送会社Controller]を変更して動かしてみます。