ASP.NET MVC 07_ビューでHelloWorld(モデル)

VisualStuidioCommunity2015/Fw4.5.2/C#


前回はビュー変数を使用して、ビューに「Hello World」 を表示しました。
今回はモデルを使用して、ビューに「Hello World」を表示します。

モデルの作成

まずはモデルから作成します。
Modelsフォルダを右クリックし、コンテキストメニューから「クラス」を選択します。
ファイル名は「HelloViewModel.cs」とします。
ビューに表示する文字列を取得および設定する「Message」プロパティを定義します。

Models/HelloViewModel.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Practice01_Begin.Models
{
    public class HelloViewModel    {

        public String Message { get; set; }

    }
}

モデルを作成したら、一旦ビルドしておきます。

コントローラの作成

前回まで使用していたコントローラー「HelloControler」に新たにアクションメソッド「ShowModel」を追加します。
17行目で、先ほど作成したHelloViewModelクラスのオブジェクトを作成し、
18行目で、Messageプロパティに「Hello World」を設定しています。
29行目では、Viewメソッドの引数にHelloViewModelオブジェクトを指定して、ビューを表示します。

Controllers/HelloControler.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Practice01_Begin.Controllers
{
    public class HelloController : Controller
    {

        //・・・前回までのコードは省略

        public ActionResult ShowModel()
        {
            //HelloViewModelオブジェクトを作成し初期値を設定する
            Models.HelloViewModel mdl = new Models.HelloViewModel();
            mdl.Message = "Hello World";
            //モデルを指定してビューを表示する
            return View(mdl);

        }
    }
}

ビューの作成

最後にビューを作成します。
コントローラーのアクションメソッド「ShowModel」にカーソルを置いた状態で右クリックし、コンテキスメニューより「ビューの追加」をクリックします。
「ビューの追加」ダイアログで、以下の項目を設定します。
・ビュー名: ShowModel
・テンプレート: Empty
・モデルクラス: HelloViewModel
・レイアウトページの使用:チェックON
テンプレートをデフォルトの「Empty(モデルなし)」から「Empty」を選択すると、モデルクラスが選択できるようになります。

作成したビューのコードを見てみましょう。
1行目に「@model Practice01_Begin.Models.HelloViewModel」と記述されています。
Viewメソッドでモデルを受け渡す場合は、@modelディレクティブで使用するモデルを宣言しておきます。
9行目ではModelプロパティでHelloViewModelモデルのMessageプロパティの値を出力しています。

Views/Hello/ShowModel.cshtml
@model Practice01_Begin.Models.HelloViewModel

@{
    ViewBag.Title = "ShowModel";
}

ShowModel

@Model.Message


デバッグ実行して、ShowModelビューに Hello World が表示されることを確認します。

ASP.NET MVC 06_ビューでHelloWorld(ビュー変数)

VisualStuidioCommunity2015/Fw4.5.2/C#


前回作成したビューに「Hello World」 を表示してみます。

ビューに表示する文字列「Hello World」をコントローラーのアクションメソッドで定義し、
ビューではコントローラーから受け取った文字列を表示します。

コントローラーとビューでデータを受け渡しする方法には、ビュー変数を利用する方法やモデルを利用する方法などがあります。
今回はビュー変数を利用します。

ビュー変数を利用すると手軽にコントローラーとビューで値の受け渡しができます。
その反面、コントローラーとビューの依存が高まります。
MVCパターンでは、コントローラーからビューにデータを渡す場合はモデルを使うことになっています。

ビュー変数とは、コントローラーとビューでデータを受け渡しできるコンテナー(値を詰め込めるもの)のことで、
Controllerクラスの親クラスであるControllerBaseクラスのViewDataプロパティやViewBagプロパティを利用します。

ControllerBase.ViewDataプロパティ

Controllerクラスの親クラスであるControllerBaseクラスのViewDataプロパティは、名称をキーに値を格納するコレクション(集まり)です。
まずはコントローラーのアクションで、キー「Message」 値「Hello World」をViewDataプロパティに格納します。

Controllers/HelloController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Practice01_Begin.Controllers
{
    public class HelloController : Controller
    {
        // GET: Hello
        public ActionResult Index()
        {
            return View();
        }

     
        public ActionResult ShowHelloMessage()
        {
            //ControllerクラスのContentメソッドはActionResult派生クラスであるContentResultクラスを返す。
            //ContentResultクラスは引数に指定した文字列をテキスト形式で出力する。
            return Content("Hello World");
        }

        public ActionResult Show()
        {
            //ViwDataはControllerの基底クラスであるControllerBaseクラスのプロパティ。
            //名称をキーに値を格納するコレクション。
            ViewData["Message"] = "Hello World";

            //ControllerクラスのViewメソッドはActionResult派生クラスであるViewResultクラスを返す。
            //ViewResultクラスはアクションメソッドの結果を対応するビューを表示する。
            return View();
        }
    }
}
次はShowビューのコードです。
HTMLにコードを埋め込むには「@」を使用します。
ViewDataに格納するキーは大文字小文字が区別されません。
ViewDataに格納していないキーを指定してもエラーにならず、何も出力されませんん。

Views/Hello/Show.cshtml

@{
    ViewBag.Title = "Show";
}

Show

ViewDataの値を表示する

Messageの値:@ViewData["Message"]

messageの値(キーは大文字小文字を区別しない):@ViewData["message"]

MSGの値(格納されていないキーを指定したときは何も表示されない):@ViewData["MSG"]



ControlBase.ViewBagプロパティ

Controllerクラスの親クラスであるControllerBaseクラスのViewBagプロパティは、dynamic型のプロパティです。
dynamic型とは匿名クラス(無名クラス)を格納する型で、そのプロパティなどはコンパイル時にチェックされず、実行時に解決されます。
つまり匿名クラスとは事前に定義されたクラスではないので、そのクラスのメンバー情報(プロパティなど)は何があるかコンパイラにはわかりません。
どんなプロパティ名を指定してもエラーにはなりません。(そのかわり、インテリセンスも効きません。)

33行目でViewBagpプロパティの匿名クラスに「Message」プロパティとその値を設定しています。
Controllers/HelloController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Practice01_Begin.Controllers
{
    public class HelloController : Controller
    {
        // GET: Hello
        public ActionResult Index()
        {
            return View();
        }

     
        public ActionResult ShowHelloMessage()
        {
            //ControllerクラスのContentメソッドはActionResult派生クラスであるContentResultクラスを返す。
            //ContentResultクラスは引数に指定した文字列をテキスト形式で出力する。
            return Content("Hello World");
        }

        public ActionResult Show()
        {
            //ViwDataはControllerの基底クラスであるControllerBaseクラスのプロパティ。
            //名称をキーに値を格納するコレクション。
            ViewData["Message"] = "Hello World";

            //ViewBagはControllerの基底クラスであるControllerBaseクラスのプロパティ
            //dynamic型の値を取得/設定できる。
            ViewBag.Message = "Hello World";

            //ControllerクラスのViewメソッドはActionResult派生クラスであるViewResultクラスを返す。
            //ViewResultクラスはアクションメソッドの結果を対応するビューを表示する。
            return View();
        }
    }
}
次はShowビューのコードです。
ViewDataと同様で
ViewBagプロパティの匿名クラスに設定されたプロパティ名は大文字小文字が区別されません。
匿名クラスに設定していないプロパティ名を指定してもエラーにならず、何も出力されませんん。

Views/Hello/Show.cshtml

@{
    ViewBag.Title = "Show";
}

Show

ViewDataの値を表示する

Messageの値:@ViewData["Message"]

messageの値(キーは大文字小文字を区別しない):@ViewData["message"]

MSGの値(格納されていないキーを指定したときは何も表示されない):@ViewData["MSG"]

ViewBagの値を表示する

Messageの値:@ViewBag.Message

messageの値(プロパティ名は大文字小文字を区別しない):@ViewBag.message

MSGの値(定義していないプロパティ名を指定したときは何も表示されない):@ViewBag.MSG

ASP.NET MVC 05_ビューの作成

VisualStuidioCommunity2015/Fw4.5.2/C#


今回はコントローラーからビューを表示してみます。

ビューを表示するコントローラーの作成

まずはビューを表示するアクションメソッドを作成します。
前々回作成したコントローラー「HelloControler」に ビューを表示するアクションメソッド「Show」を定義します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Practice01_Begin.Controllers
{
    public class HelloController : Controller
    {
        // GET: Hello
        public ActionResult Index()
        {
            return View();
        }

     
        public ActionResult ShowHelloMessage()
        {
            //ControllerクラスのContentメソッドはActionResult派生クラスであるContentResultクラスを返す。
            //ContentResultクラスは引数に指定した文字列をテキスト形式で出力する。
            return Content("Hello World");
        }

        public ActionResult Show()
        {
            //ControllerクラスのViewメソッドはActionResult派生クラスであるViewResultクラスを返す。
            //ViewResultクラスはアクションメソッドの結果を対応するビューを表示する。
            return View();
        }
    }
}

ビューの作成

アクションメソッドを作成したら、次にビューを作成します。
アクションメソッド「Show」にカーソルを合わせて右クリックし、コンテキストメニューより「ビューの追加」をクリックします。

「ビューの追加」ダイアログが表示されるので、デフォルトのまま追加ボタンをクリックします。

ソリューションエクスプローラーで、Viewsフォルダの直下にHelloフォルダ/Show.cshtmlファイルが作成されていることを確認します。

アクションメソッドで引数なしのViewメソッドを呼び出しましたが、
引数なしのViewメソッドは、デフォルトで「Views/コントローラー名/アクション名.cshtml」のビューを検索し表示します。

ですので、ビューは
Viewsフォルダの直下に、コントローラー名のフォルダ、その直下に アクション名.cshtml という名前で配置する必要があります。


デバッグ実行し「http://localhost:12345/Hello/Show」とアドレスを入力するか、
ビューのコードを表示した状態でデバッグ実行し、ビューが表示されることを確認します。

ASP.NET MVC 04_ルーティングの基礎

VisualStuidioCommunity2015/Fw4.5.2/C#


前回は、コントローラーとアクションメソッドを作成しました。

その際、
ASP.NET MVCでは「フロントコントローラ方式」で、リクエストを1カ所で受け取り、URLから個々のコントローラークラスに振り分けます。
コントローラークラスには複数のアクションメソッドが定義されていて、URLからどのアクションメソッドが実行されるかが決定します。
アクションメソッドではユーザーからのリクエストに応じた処理を行って、ビューを表示するなどのレスポンスを返します。
と書きました。

今回は、リクエストされたURLからどのようにコントローラーとアクションメソッドが呼び出されているのか見ていきます。
リクエストされたURLから呼び出すアクションを決定する仕組みのことをルーティングと言います。

ルート定義ファイル

ルーティングを行うためのルート定義はソリューションのApp_Startフォルダ/RouteConfig.csファイルに記載されています。

プロジェクトを作成するとデフォルトで以下の内容が書かれています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace Practice01_Begin
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}
RouteConfigクラスのRegisterRoutesメソッドで、ルート定義を作成します。

16行目~20行目でリクエストURLが、どのコントローラーのどのアクションメソッドにマッピングされるかが定義されています。
routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

RouteCollectionクラスのMapRouteメソッドで、マッピングのルートを設定します。
MapRouteメソッドの引数
・nameはルートを識別するための名前です。一意になるように設定します。
・urlはマッピングを行うためのURLのパターンを設定します。
・defaultsはurlで指定したプレースホルダー({}で囲まれた部分)が省略された時のデフォルト値を指定します。

つまりルート名「default」の定義は
・URLが「コントローラー名/アクションメソッド名/アクションメソッドの引数」で構成されていて
・コントローラー名が指定されていなければ「Home」コントローラーを
・アクションメソッドが指定されていなければ「Index」アクションメソッドを
・アクションメソッドの引き数idはUrlParameter.Optionalで省略可能です。
ということになります。

以下のようなリクエストURLはすべて、HomeコントローラーのIndexアクションメソッドが呼ばれれます。
URLの大文字小文字は区別されません。
http://localhost:12345
http://localhost:12345/Home
http://localhost:12345/Home/Index
http://localhost:12345/Home/Index/xxx


ルート定義をアプリケーションに適用する

RouteConfigクラスのRegisterRoutesメソッドで、ルート定義を作成しただけではルーティングは行われません。
あたりまえですけど、RegisterRoutesメソッドではメソッドの処理を書いただけで、メソッドを呼び出さなければその処理は実行されません。
「Config」と付いていると、定義を書くだけでアプリケーションに適用されそうな気がしてしまうのは私だけでしょうか・・・

アプリケーションでルーティングを行うためには、Global.asaxファイル内の Application_Startイベントで、RouteConfigクラスのRegisterRoutesメソッドを呼び出します。
Global.asaxはグローバルアプリケーションファイルと呼ばれ、アプリケーションレベルでのイベントを処理するためのクラスです。
アプリケーションが起動すると、Application_Startイベントが発生します。
このApplication_Startイベント内でRouoteConfigクラスのRegisterRoutesメソッドを呼び出すことで、ルーティングがアプリケーションに適用されます。


プロジェクトを作成すると、Global.asaxファイルにはデフォルトで以下の内容が書かれています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace Practice01_Begin
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}
17行目でRouteConfigクラスのRegisterRoutesメソッドを呼び出しています。

ルートを定義してみる

新しいルートを定義してみます。

デフォルトルートより前にGreetingルートを追加してみました。
Greetingルートでは、URL「http://localhost:12345/Greeting/Show」を前回作成したHelloコントローラのShowHelloMessageアクションメソッドにマップします。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace Practice01_Begin
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            //Greetingルート
            routes.MapRoute(
                name: "Greeting",
                url: "Greeting/Show",
                defaults: new { controller = "Hello", action = "ShowHelloMessage" }
            );
            //デフォルトルート
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

            
        }
    }
}
MapRouteメソッドの引数 url にコントローラー名とアクション名が含まれない場合、引数 default にコントローラ名とアクション名が必須になります。
デバッグ実行し、アドレスバーに「http://localhost:12345/Greeting/Show」と入力します。
前回同様に「Hello World」と表示されます。

次に、GreetingルートをDefaultルートの後ろに定義してみます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace Practice01_Begin
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            //デフォルトルート
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
            //Greetingルート
            routes.MapRoute(
                name: "Greeting",
                url: "Greeting/Show",
                defaults: new { controller = "Hello", action = "ShowHelloMessage" }
            );

        }
    }
}
先ほどと同じようにデバッグ実行し、アドレスバーに「http://localhost:12345/Greeting/Show」と入力します。
今度は以下のようなエラー画面が表示されました。

URL 「http://localhost:12345/Greeting/Show」 はDefaultルートが適用され、Greetingがコントロール名、Showがアクションメソッド名としてルーティングされるんですね。

ルートを定義する順番には注意が必要です。

ASP.NET MVC 03_HelloWorld

VisualStuidioCommunity2015/Fw4.5.2/C#


お約束で「Hello World」の出力です。

コントローラーとアクションメソッド

ASP.NET Webフォームは「ページコントローラ方式」で個々のページでリクエストを処理していましたが、
ASP.NET MVCでは「フロントコントローラ方式」で、リクエストを1カ所で受け取り、URLから個々のコントローラークラスに振り分けます。
コントローラークラスには複数のアクションメソッドが定義されていて、URLからどのアクションメソッドが実行されるかが決定します。
アクションメソッドではユーザーからのリクエストに応じた処理を行って、ビューを表示するなどのレスポンスを返します。

つまりコントローラークラスとアクションメソッドがないと何も始まらないということです。

コントローラーの作成

まずはコントローラークラスを作成します。

Conrollersフォルダを右クリックしコンテキストメニューより 「追加」 > 「コントローラー」 を選択します。
「スキャンフォールディングを追加」ダイアログより「MVC 5 コントローラー -空」を選択します。

コントローラー名を表示するダイアログが表示されますので、「HelloControler」とします。

以上でControllersフォルダにHelloControl.csファイルが作成されました。

コントローラークラスの約束事ですが
コントローラーの名前には必ず「Controller」というサフィックスを付けます。
コントローラー名はこの「Controller」を除いた部分になります。(「HelloController」のコントローラー名は「Hello」になります。)
Controllerクラスを継承します。

アクションメソッドの定義

次にコントローラークラスにアクションメソッドを定義していきます。

従来のASP.NET Webフォームでは、ユーザーがボタンをクリックしたときの処理は各ページのコードビハインドにイベントとして記述されていました。
ASP.NET MVCでは、ユーザーがボタンをクリックしたときの処理はコントローラクラスにアクションメソッドとして記述します。

それではHelloControllerに「Hello World」を出力するアクションメソッドを定義します。

コントローラー「HelloController」のコードを見てみると、最低限のコードが記載されています。
デフォルトで用意されているIndexメソッドをまねて、以下のようなShowHelloMessageアクションメソッドを定義します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Practice01_Begin.Controllers
{
    public class HelloController : Controller
    {
        // GET: Hello
        public ActionResult Index()
        {
            return View();
        }

     
        public ActionResult ShowHelloMessage()
        {
            //ControllerクラスのContentメソッドはActionResult派生クラスであるContentResultクラスを返す。
            //ContentResultクラスは引数に指定した文字列をテキスト形式で出力する。
            return Content("Hello World");
        }
    }
}
アクションメソッドの条件は、コントローラークラスに定義されている、戻り値がActionResultでpublicなメソッドです。
コントローラークラスに定義されているpublicなメソッドはすべてアクションメソッドと見なされます。
戻り値がActionResultでないpublicメソッドを定義する場合は、NonActionAttribute属性を付ける必要があります。

ContentメソッドはControllerクラスのメソッドで、引数に指定した文字列をテキスト形式で出力します。


以上でコントローラーとアクションメソッドの作成が終了しました。

IEでデバッグ実行し、起動したページのアドレスに「http://localhost:12345/Hello/ShowHelloMessage」と入力します。
※「12345」の部分は実行するたびに変わります。

「Hello World」が表示されます。

ASP.NET MVC 02_プロジェクトの作成

VisualStuidioCommunity2015/Fw4.5.2/C#


最初はお約束でHelloWorldを出力してみます。

プロジェクトの作成

まずはASP.NET MVCプロジェクトを作成します。
Visual Studio 2015 Community を起動し、メニューより ファイル > 新規作成 > プロジェクト を選択します。
「新しいプロジェクト」ダイアログから インストール済み > テンプレート > Visual C# > Web > ASP.NET Webアプリケーション を選択します。

プロジェクト名、保存場所を指定してOKボタン押すと「新しいASP.NET プロジェクト」ダイアログが開きます。
「MVC」テンプレートを選択し、「Host in the cloud」をチェックOFFします。

以上でプロジェクトは作成できました。

プロジェクトには以下のようなフォルダが標準で作成されています。
App_Dataデータベースなどアプリケーションで使用するデータを保存するフォルダ
App_Start認証やルーティングなどの設定ファイルを保存するフォルダ
Contentスタイルシートなどを保存するフォルダ
Controllersコントローラークラスを保存するフォルダ
fontsBootstrapで使用しているアイコンを保存しているフォルダ
Modelsモデルクラスを保存するフォルダ
ScriptsJavaScriptやjQueryなどを保存するフォルダ
Viewsビューを保存するフォルダ

ASP.NET MVC 01_環境の作成

ASP.NET MVC 5 実践プログラミングを買いました。

プログラミングMicrosoft ASP.NET MVC 第3版ASP.NET MVC 5 対応版 (マイクロソフト公式解説書)も買いました。

この本を教科書にして手を動かしながら少しずつ勉強していこうと思います。

環境作成

まずは環境作成からです。
無償のVisual Studio Community Edition 2015を利用しようと思います。

下記のサイトからWebインストーラー「Microsoft Web Platform Installer 5.0」をダウンロードします。

ダウンロードした「wpilauncher.exe」を実行し、右上の検索ボックスに「2015」と入力して検索を実行します。

検索結果の一覧から「Visual Studio Community Edition 2015」を追加し、インストールを開始します。
インストールはかなりの時間がかかりました。

次にVisualStudio2015を日本語化するために以下のサイトから「Microsoft Visual Studio 2015 Language Pack」をダウンロードします。
https://www.microsoft.com/ja-jp/download/details.aspx?id=48157
ダウンロードした「vs_langpack.exe」を実行しインストールします。
こちらも結構な時間がかかりました。

以上で環境作成は終了です。

ASP.NET MVC 始めました。

今年初めに転職してもうすぐ1年です。

職場の99%がCOBOL出身者で、.NET(VB)に移行された方たちでした。
仕事は.Net2013(VB)+Oracle。Windows Form アプリ開発。

…あれ?.Netだよね?え?VB6じゃね?


そんな職場のVBあるあるですが
option strict off。
むちゃな型変換(戻り値stringなのにtrue/falseが返る)
金額計算で桁落ち発生。
onにしようと提案するも却下

すべてのメソッドはtrue、falseを返す。
しかし呼び出し元ではtrue。falseの結果は無視される

例外キャッチしてログを残すが、各開発者が気になるところだけtry~catch。
例外一元管理を提案。
それでも例外はキャッチされ、再スローではなく新スローされる。もしくは握りつぶされる。

クラス、継承、インターフェースがわからない
インターフェースを使ったら、皆がわからないからダメだと言われた

省略しすぎた変数名。クラス名。
省略しないメソッド名を書いたら長すぎると笑われた

変数名は接頭辞必須。
しかし値型でなければ接頭辞はすべてobjXXXX。意味ないだろソレ。

プロジェクト名やフォーム名はアルファベット3文字+数字5ケタ。
ベテランでもなければ対応表がなければ、どれが何なのかわからない。
もちろん対応表はない。

ストアド大好き
ストアドはCOBOL時代からだから、慣れてるもんね

あげたらキリがない。

もうね。
あ~残りの人生、ここで一生VBでWinフォームつくるんだ~
クソおもんないっ!ってちょっと腐ってました。

Winフォームの方は会社内で遺産があり、新しい作り方は受け付けないって感じで
ワンマン社長(開発もする)に釘さされました。

Webフォーム(VB)にはまだ参戦できそうだったので、そちらの方に力入れてたんですが
案件が少ない。
(それでも少しは影響を与えることができたかな・・・)

そんな中ASP.NET MVCで開発するぞっって話が出てきました。
私が参加できるかは微妙だけど、チャンスがあるなら手をあげれるように

ASP.NET MVC 始めました。

.NET 例外「Cannot drop database. ’データベース名’ because it is currently in use」

ASP.NET MVC5のお勉強中です。
サンプルに従って順次実行していってるのですが、

デバッグ実行して、ローカルDBからデータをViewに表示する
↓
デバッグ停止
↓
サーバーエクスプローラーでDBの内容を確認する。
↓
再度デバッグ実行して、Viewを表示すると例外が発生して表示できません。

例外の内容は
Cannot drop database. ’データベース名’ because it is currently in use
データベースが使用中で削除できないとのことです。

サーバーエクスプローラーでDBの内容を確認すると
データベースに接続中になり、アイコンが緑のコンセントマークになります。

データベースを右クリックメニューから「切断」して実行すると、アイコンが×に変わります。

データベースを切断してから実行すると、例外が出ずに実行できました。

サンプルでは
DropCreateDatabaseAlwaysやDropCreateDatebaseIfModelChangesを使用してデータベースに初期データを作成しているので、
データベースに接続したままだと、データベースが削除できないヨと怒られたんですね。

Oracle ストアドの内容をファイルに出力する

Oracleのストアドの内容をバッチファイルでsqlplusで出力する方法です。

まずSQLファイルを作成します。
CドライブにCreate.sqlでファイルを作成したとします。
ストアドの出力先はCドライブのOutput.sqlとしています。
set echo off
set heading off
set termout off
set pause off
set pagesize 0
set linesize 1000
set trimspool on
set feedback off

spool C:\Output.sql

SELECT TEXT
FROM   ALL_SOURCE
WHERE  NAME = 'ストアド名'
ORDER BY TYPE, LINE;

spool off;

quit

次にバッチファイルを作成します。
CドライブにCreate.batでファイルを作成したとします。
sqlplusを使用して先ほど作成したsqlファイルを実行します。
sqlplus Oracleユーザー名/パスワード@データベース名 @C:\Create.sql

バッチを実行すると、ストアドの内容が「そのまま」出力されています。

ストアドの内容をCreate文付きで出力するのならコチラ。
set pages 0
set lines 200
set long 65535
set longc 65535
set trimspool on

spool 出力先ファイルパス

SELECT 
 DBMS_METADATA.GET_DDL(OBJ.OBJECT_TYPE, OBJ.OBJECT_NAME, OBJ.OWNER) AS SCRIPT
FROM DBA_OBJECTS OBJ
WHERE
 OBJ.OWNER ='ユーザー名'
 AND OBJ.OBJECT_TYPE ='PACKAGE'
 AND OBJ.OBJECT_NAME ='ストアド名';

spool off;

quit