11月16日(月)1、2コマ目

今日、やったこと

新課題「C#版簡単オークションサイト」の説明

今日のホワイトボード

処理結果を伝える

以前から話している内容そのままです。とくに真新しい内容はありません。

図 処理結果を伝える


[データベース]列の初期値

INSERT INTO実行時に挿入値が未指定の場合にデフォルト値が登録されるようにするには、図のようにdefaultを使って初期値を指定します。

図 応札日時列の初期値は現在日時(systimestampで取得できる)


なお、列制約構文での制約、さらに初期値を指定する場合は下図の順になります。

create table テーブル名(

 列名 データ型 default 初期値  制約

)


入札処理

入札前の最高値取得は1人だけしかできないようにしなければならない。

入札最高値より高い金額しか入札できません。

まず、入札最高値をチェックする必要がありますが、下図のようにAさん、Bさんがほぼ同じタイミングでチェック(ロックしなければできる)し、先にBさんがDBに書き込むとAさんはエラーにする必要がありますが、Aさんのチェック時では最高値以上であるため、エラーにできません。

そこで、まず入札データテーブルの対象商品のデータをすべてロックし、ロックできた人がだけその後の処理(最高値取得、チェック、データ書き込み)ができるようにしてください。

図 最高値は1人だけしか取得できないようにするために


NotFilledExceptionについて

シーケンス図に書いてありましたが、ちゃんと説明をしていなかったので。

未入力項目がある場合は、NotFilledExceptionをスローするとかいてあります。

〇NotFilledExceptionクラスをつくる

まず、NotFilledExceptionクラスですが、自作例外クラスです。Exceptionを継承してください。

図 自作例外クラスNotFilledExceptionをつくる


〇空白チェックのながれ

tryブロック内は正常系をメインに実装し、catchブロックでエラー内容に応じた処理を書くのがtry~catchの一般的な実装です。

図 空白チェックのながれ


ページ遷移

ログインページのOnPost()は以下のようになります。

ポイントは

  • OnPost()の戻り値はIActionResult
  • 遷移先はreturn RedirectToPage(遷移先)で指定

です。


public IActionResult OnPost(string username, string password)

{

 try

 {

  // 入力チェック

  if(string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))

  {

   // 例外スロー

   throw new NotFilledException("ユーザー名、パスワードを入力してください");

  }


  // 認証

  if(Service.Authenticate(username, password))

  {

   // 認証成功


   // 商品一覧ページへ

   return RedirectToPage("/ItemList");

  }

  else

  {

   // 認証失敗

   // セッションオブジェクトへエラーメッセージセット

   // このページに戻る

   return RedirectToPage("/Index");

  }

 }

 catch(NotFilledException ex)

 {

  // セッションオブジェクトへエラーメッセージセット

  // このページに戻る

  return RedirectToPage("/Index");

 }

}

図 ページ遷移


セッションオブジェクトへのアクセス

コンストラクタからはアクセスできません。

図 セッションオブジェクトへのアクセス



コメント

このブログの人気の投稿

11月2日(月)1、2コマ目

10月13日(火)1、2コマ目