BlazorのUIコンポーネントのRadzenで簡単にCRUDを作ってみる(Oracle)

Visual StudioからRadzenやらOracleドライバーをNugetして。。。。でも手動でCRUDアプリはもちろん作るけども、今回はスキャフォルディングでCRUDアプリケーションを作ってみようと思う。

 

前提

Windows10

Visual Studio 2019

.NET Core 3.1

Oracle 12c以降

 

Mac版、Linux版もあることからほぼ同一手順でできることと思われる。

 

手順

まず、下記サイトからRadzenアプリケーションをダウンロード・インストール。基本部分はこれで作ることになる。

www.radzen.com

Radzenアプリケーションを起動してNewをクリック。

f:id:tomo_k:20210108064048p:plain

FrameworkはBlazorを選択

Server-sideを選択

.NET Core3.1を選択(まだ.NET5ではうまくいかなかった)

テーマはお好みで

名前とディレクトリは適切に設定してください

 

必要事項を入力し終えたら、「Create」ボタンを押下

f:id:tomo_k:20210108064509p:plain

まだ、何もページがない状態のアプリケーションが作成されます。

右上の「data」をクリックします。

 

f:id:tomo_k:20210108064636p:plain

 

左側の+newをクリックします。

 

f:id:tomo_k:20210108064812p:plain

ここで、データベースの接続情報を入力していきます。

OracleDBのIPアドレス

SID

ユーザ名

パスワード

といった情報を入力します。

 

入力後、「Infer Schema」ボタンを押下します。

 

f:id:tomo_k:20210108065319p:plain

 

一番上のGenerate page for GRUD operationsにチェックを入れてその右側のEntitesのボックスの中から実際にCRUDしたいテーブル・ビューにチェックを入れていきます。

 

Date formatは「yyyy/MM/dd」に変えておくことを推奨します。

残りのオプションはお好みによって調整してください。

面白いところでは、Enable export to Excel and CSVというのでExcelCSVにエクスポートできる機能です。

ページサイズのデフォルトは10なのでもう少し大きめにしておくとよいと思います。

 

すべて確認したら、「finish」ボタンを押下します。

 

f:id:tomo_k:20210108065854p:plain

 

すると、データソースができています。

f:id:tomo_k:20210108070018p:plain

アプリケーションに戻ると、ページができていることが確認できるかと思います。

右上の「run」ボタンで動かしてみましょう。

 

f:id:tomo_k:20210108070213p:plain

ここまででうまくいけばブラウザでこのようにDBのテーブルが表示されるはずです。

もし、うまくいかない場合はライブラリーの不整合が起きていると考えられるのでRadzenアプリケーションで作成されたプロジェクトファイルをVisualStudio2019で開いて原因となっている箇所を特定してNugetで適切なバージョンのライブラリに入れ替えてください。

 

Azure Static Web Appsでのフォールバックルート

docs.microsoft.com

ルートを指定したらすべてindex.htmlを返すというような動作に使える。

それどころか、404を返すようなパターンはすべからくindex.htmlを返すというような動作もできる。

 

例えば、ルートを指定したらindex.htmlを返すというような動作をする。まるで、IISの既定のドキュメントの動作のような設定は以下の通り。

 

routes.json

{
  "routes": [
    {
      "route": "/",
      "serve": "/index.html",
      "statusCode": 200
    }
  ]
}    

 

 

C# 6.0 get アクセサーのみの自動実装プロパティ を式本体の定義

csharp-tokyo.connpass.com

C# Tokyo 2.0から始めるC#入門/再入門に参加して今まで全然使ってこなかったけどもこれは便利だなと思った機能を上げていきます。

 

 

getアクセサーのみの自動実装プロパティを式本体の定義

getのみを持つプロパティでそのプロパティは式で表現できるものを簡潔に表現できるという機能。

例えば、姓と名を入れたらフルネームは自動的に表現できますのでsetメソッドは必要ないですよね。しかも、姓+名で文字列連結させることで表現できますのでこういったパターンに使える機能。

 

コード例

 

    
    class Program
    {
        static void Main(string[] args)
        {
            FirstName = "友光";
            LastName = "草場";

            Console.WriteLine($"{FullName}");
            Console.WriteLine($"{FullNameOldType}");
        }

        static string FirstName { get; set; }
        static string LastName { get; set; }
        static string FullName => $"{FirstName} {LastName}";
        static string FullNameOldType { get { return $"{FirstName} {LastName}"; } }
    }

 

実行結果

 

友光 草場
友光 草場    

 従来は、こういったパターンだとgetメソッドの内容を記述していたようなイメージだったのですが、プロパティの定義をラムダ式でかけるようになったってことですね。

大分すっきりかけるようになっていることがわかるかと思います。

C# 6.0 自動実装プロパティの初期化

csharp-tokyo.connpass.com

C# Tokyo 2.0から始めるC#入門/再入門に参加して今まで全然使ってなかったけどもこれは便利だなと思った機能を上げていきたいと思います。

 

自動実装プロパティの初期化

C#では自動実装プロパティはよく使っていましたが、初期値を設定するにはコンストラクタなどで設定するのが通常でした。

この場合、プログラムミスなどでNULLの危険性がはらんでいます。特に、旧来の.NET Framewokなどではstring型などNULLを許容する型が存在しており多く使われていることが想像できます。

意図しない、NULLをなくすためにも初期値として何らかの値を入れる。例えば空白を初期値で持たせるなどの処置が多くのプロパティで必要になるのではないかと考えます。

 

コード

    class Program
    {
        static void Main(string[] args)
        {
            prpTest test = new prpTest();
            
            Console.WriteLine($"prp1      : {test.prp1}");
            Console.WriteLine($"prp2      : {test.prp2}");
            Console.WriteLine($"intprp    : {test.intprp}");
            Console.WriteLine($"notinit   : {test.notinit}");
            Console.WriteLine($"intnotinit: {test.intnotinit}");
            if (test.notinit == null)
            {
                Console.WriteLine("test.notinit はNULLです。");
            }

        }

        class prpTest
        {
            public string prp1 { get; set; } = "hoge";
            public string prp2 { get; set; } = "fuga";
            public int intprp { get; set; } = 10;

            public string notinit { get; set; }
            public int intnotinit { get; set; }
        }
    }

 実行結果

prp1      : hoge
prp2      : fuga
intprp    : 10
notinit   :
intnotinit: 0
test.notinit はNULLです。    

 

プロパティの行にそのまま初期値がかけるので初期値の入れ忘れがない。

また、従来の動作だと実行結果の示すとおりstring型の初期値はNULLであるのでなにも値がセットされないままであるとNULLのままであり例外の発生の温床になってしまう。

また、近頃のC#の指針にもあるようにNULLに対して非常に厳しくなってきているので初期値の入れ忘れという観点から見ればコンストラクタで設定するよりもこの機能を活用した方がよいと感じた。