喜帳面の日記

50歳越えおやじのASP.NET MVC への挑戦日記です。

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
    {
    }
}

このスクリプトに手を加えていきます。

f:id:SannomiyaNotes:20121130193520p:plain

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]を変更して動かしてみます。