投稿

7月25日(火)3、4コマ目

イメージ
今日、やったこと C#でトランザクション実装 コミット、ロールバック ロック 今日のホワイトボード C#+ODP.NETでトランザクションの実装をしました。 トランザクションを実装するには 〇OracleTransactionオブジェクト取得 トランザクションは最後にコミット、ロールバックを実行する必要があります。 C#+ODP.NETではコミット、ロールバックはOracleTransactionオブジェクトが持つCommit()、Rollback()メソッドで実行します。 このOracleTransactionオブジェクトは接続済み(Open()実行済み)のOracleConnectionオブジェクトのBeginTransaction()で取得できます。 〇複数種類のSQLを同一トランザクションのメンバにする また、1トランザクションで複数種類のSQLを実行する場合、複数のOracleCommandオブジェクトを使います。この複数のOracleCommandオブジェクトのTransactionプロパティに同じOracleTransactionオブジェクトをセットすることで、同一トランザクションのメンバになります。 図 OracleTransactionオブジェクト サンプルプログラム1 コミット、ロールバック ソースコードをあげておきます。 Item.cs 商品情報受け渡し用クラス。いつもプロパティとコンストラクタのクラス。 ItemDAO.cs ポイントはUpdate()のOracleTransactionを使ったトランザクションに関する実装。 using(){ }を使えば、自動的にClose()を実行してくれる。 図 using(){ }で自動的にClose()実行 Index.cshtml.cs 価格を入力するテキストボックスが増減する可能性があるため、OnPost()の引数で入...

7月18日(火)1、2コマ目

イメージ
今日の予習 確実にDBを閉じる データベースに接続(ConnectionのOpen()実行)すると、最後には必ず切断(ConnectionのClose())を実行する必要がある。 finally句でClose()実行 古典的な方法。 using句で自動的にClose()実行 using()の()内で宣言、生成したインスタンスはusing()につづくブロック終了時に自動的にDispose()が実行される。このDispose()内でClose()が実行される。よって、明示的にClose()を呼び出す必要がなくなる。 トランザクション処理 Transactionオブジェクトを使ってコミット、ロールバックを行う。 今日、やったこと DBのトランザクション(続き) トランザクションの実装 今日のホワイトボード 前回からの「DBのトランザクション」の続き。 トランザクションの一貫性 トランザクションのACID特性の1つである”トランザクションの一貫性”とはトランザクションを単独で実行しても、複数同時に実行しても結果は変わらない。 下図では、Aさん、Bさんの入札処理はそれぞれ単独なら問題は発生しないが、同時に実行するとタイミング次第(Bさんの書き込みがAさんより早いとき)で問題が発生する。これが一貫性が確保されていない状態。 図 トランザクションの一貫性が確保されていない トランザクションの一貫性を確保するために、複数同時に実行するトランザクションをどれくらいのレベルで分離するか4段階で決められている。 全く分離しない”Read Uncommitted”から完全に分離する"Serializable"まで4段階ある。 オラクルのデフォルトの分離レベルは"Read Committed"。別トランザクションの非コミットなデータは読み込まない(ダーティーリードは発生しない)が、コミットすれば読み込むため、ファジーリードやファントムリードが発生する。 データのロック 更新が同時に実行されないように、更新時にまず対象データをロックする。なお、このロックは自動的に行われ、コミットまたはロールバックで解除される。 図 更新対象行をロック トランザクション分離レベル"Serializable...

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

イメージ
今日、やったこと [確認テスト]Razorページ+ODP.NET トランザクション 今日のホワイトボード [確認テスト]Razorページ+ODP.NET 正解例をあげておきます。 Group.cs グループ情報受け渡し用クラス。 Item.cs 商品情報受け渡し用クラス。 GroupDAO.cs CS_グループマスタテーブルアクセス用クラス。 ItemDAO.cs CS_商品マスタテーブルアクセス用クラス。 ポイント あいまい検索で引っかかっている人がかなりいました。 演算子はlike パラメータマーカーに"%"+検索キーワード+"%"を差し込む 図 あいまい検索 Index.cshtml.cs Index.cshtml トランザクションとは 1件の処理=1トランザクション 送金処理や在庫数更新のような1つの処理で1つのトランザクション。 1つのトランザクションには複数のSQLを実行するケースが多い。 トランザクションに必要な要件 基本情報とかに出てくるACID特性が必要。 Atomicity(原子性) Consistency(一貫性) Isolation(独立性) Durability(永続性) トランザクションの原子性 トランザクションが終了したときに、 全てのSQL(更新)を実行 まったくSQL(更新)を実行していない のいずれかでなければならない。更新したデータもあれば、更新できなかったデータもあるはNG。 図 トランザクションの原子性 commit、rollback トランザクションの原子性はcommit、rollbackで実現。 図 commit、rollback トランザクションの独立性 トランザクションは単独で実行しても、複...

7月4日(火)1、2コマ目

イメージ
今日、やったこと Razorページ+ODP.NET 今日のホワイトボード 前回の確認テスト ボタンが複数個あるため、OnPost()ではどのボタンがクリックされたかを判別する必要がある。 図 課題のヒント ソースコードは 先週のサイト に掲載済み。 サンプル1 CS_グループマスタを全件検索した結果を表形式で表示。 Group.cs CS_グループマスタ検索結果を受け渡すためのクラス。 GroupDAO.cs CS_グループマスタテーブルアクセス用クラス。 Index.cshtml.cs Index.cshtml サンプル2  選択されたグループに属する商品を検索。 図 サンプル2 Group.cs グループ情報受け渡し用クラス。 サンプル1と同じ。 Item.cs 商品情報受け渡し用クラス。 とくにややこしくないと思うので省略。 GroupDAO.cs cs_グループマスタテーブルアクセス用クラス。 サンプル1と同じ。 ItemDAO.cs cs_商品マスタテーブルアクセス用クラス。 パラメーターマーカー利用。 Index.cshtml.cs 検索結果はプロパティで受け渡し。 Index.cshtml 特に問題ないかと。 サンプル3 xxx円以上、xxx円以下の商品を検索。 図 サンプル3 Item.cs 商品情報受け渡し用クラス。 今回はグループ情報も追加。Groupクラスも使っているが、Groupクラスは省略。 ItemDAO.cs パラメータマーカーを2つ利用。 Index.cshtml.cs Index.cshtml 次回は テストをします。

6月27日(火)1、2コマ目

今日、やったこと [確認テスト]Razorページ課題8(前回のつづき) [確認テスト]おまけ1(〇×ゲーム) 今日の課題 [確認テスト]Razorページ課題8 ポイントはコーヒーとたべものの2つあるカートへボタン。 正解例をあげておきます。 Program.cs Sessionを使えるように。 SessionExtentions.cs いままでどおり。 Item.cs 商品(コーヒー、食べ物)情報受け渡し用クラス。  SelectedItem.cs 選択済み商品情報受け渡し用クラス。 Cartクラスの選択済み商品リストに追加される際に、注文番号プロパティOrderNumberプロパティ)に値がセットされる。このOrderNumberプロパティは同じCartクラスのインスタンスではオンリーワンになる。この値で選択済み商品リストから商品を特定する。 Cart.cs ショッピングカートのようなクラス。 選択済み商品を保存するItemListプロパティ(List<SelectedItem>クラス)、注文番号候補を保存するOrderNumberプロパティがある。 Index.cshtml.cs OnPost()メソッドでどのボタンがクリックされたかを判断するところがポイント。 Index.cshtml [確認テスト]おまけ1 3x3のマスの情報やどっちの順番(〇の順番、×の順番)など、○×ゲームの流れを管理するGameクラスがポイント。 あと、授業ではやってないEnum(列挙型)も使っている。Enumは定数のセット集みたいなもの。 MaruBatsuEnum.cs 列挙型。定数のセット集。 各マスに表示される、〇、×、空白にそれぞれ定数を設定。この列挙型にまとめている。 Game.cs ○×ゲームの各情報(各マスの情報、順番)を扱う。 Index.cshtml.cs 起動すると、GETコマンドでリクエストするため、OnGet()が動く。 3x3の各マス(実態はボタン)をクリックするとOnPost()が動く。 Index.cshtml 3x3の各マスの実態はボタン。 クリックすると、各マスの位置情報(...

6月20日(火)1、2コマ目

イメージ
今日、やったこと Cartクラスを使う [確認テスト]Razorページ 課題8 今日のホワイトボード [アプリケーション作成]Cartクラスを使う 前回紹介した、選択済み商品を扱うためのショッピングカートのようなCartクラスを使ったアプリケーションを作成。 図 作成したアプリケーション Program.cs いままでとおり。Sessionオブジェクトを使えるように。 SessionExtentions.cs いままでとおり。 Udon.cs うどん情報を受け渡すためのクラス。 SelectedItem.cs 選択済み商品情報受け渡し用クラス。 このクラスに選択済み商品リストから商品を識別するための注文番号プロパティ(OrderIDプロパティ)を追加。 Cart.cs ショッピングカートのようなクラス。 OrderIdプロパティは注文番号候補を保存するプロパティ。 選択済み商品リスト(ItemListプロパティ)に商品を追加する際、OrderIdプロパティから注文番号を生成し、選択商品のOrderIDプロパティにセット。 Index.cshtml submitボタンが、カートへボタンと削除ボタンの複数ある。 どのボタンがクリックされたかがわかるように  カートへボタンのname属性は"cart"、value属性は"cart" を設定している。カートへボタンをクリックした際はOnPost()の引数cartには”cart"がセットされ、削除ボタンクリック時には引数cartはnullになる。 図 どのボタンがクリックされたか判断する 引数cartでカートへボタンがクリックされたか、削除ボタンがクリックされたかがわかる。 Index.cshtml.cs カートへボタン、削除ボタンのどちらがクリックされてもOnPost()メソッドが動く。 引数cartでどちらがクリックされたかがわかるようにしている。 削除ボタンのvalue属性はリストの添え字でいいのでは 削除ボタンのvalue属性にわざわざ注文番号などは使わずに、リストの添え字を使ってもリスト中から1つの商品を識別できるような気がす...