第25章 研修全体のまとめと到達確認演習
この章の目的
Section titled “この章の目的”この章では、ここまで学習してきたC#研修の内容を振り返り、最後に個人で小さな到達確認演習に取り組みます。
この研修では、C#の基本文法から始まり、クラス、オブジェクト指向、例外処理、Oracle Database接続、Webアプリ、Windowsフォームアプリまで学習してきました。
これまでに扱った主な内容は次の通りです。
C#の基本文法クラスとオブジェクト配列、List、LINQ例外処理Oracle Database接続ASP.NET Core MVCWindowsフォームアプリDataGridView登録・更新・削除Gitによる提出すべてを完全に覚えている必要はありません。
大切なのは、現場で既存のコードを見たときに、次のように考えられることです。
このクラスは何を表しているのかこのメソッドは何をしているのかどこでDBに接続しているのかどこで画面に表示しているのかどこで入力値を受け取っているのかエラーが起きたとき、どこを確認すればよいのかこの章では、研修全体の流れを整理し、最後に小さな演習を通して、自分がどこまで理解できているかを確認します。
この章でできるようになること
Section titled “この章でできるようになること”この章を終えると、次のことができるようになります。
- C#研修で学んだ内容を大きな流れとして説明できる
- コンソールアプリ、Webアプリ、Windowsフォームアプリの違いを説明できる
- クラス、プロパティ、メソッドの役割を説明できる
- DB接続処理の基本的な流れを説明できる
- WebアプリにおけるController、Model、Viewの役割を説明できる
- WindowsフォームアプリにおけるForm、イベント、DataGridViewの役割を説明できる
- 既存コードを読むときの確認ポイントを説明できる
- 小さな機能追加を自分で進められる
- Gitで成果物を提出できる
- 今後の学習課題を自分で整理できる
本章で使用する環境
Section titled “本章で使用する環境”| 項目 | 内容 |
|---|---|
| 開発環境 | Visual Studio 2022 |
| 対象 | これまで作成したC#プロジェクト |
| DB | Oracle Database |
| 接続ユーザー | pingt |
| 使用する表 | employees、departments |
| 提出方法 | Gitでcommit、push |
25-1 研修全体の流れを振り返る
Section titled “25-1 研修全体の流れを振り返る”前半:C#の基本
Section titled “前半:C#の基本”研修の前半では、C#の基本を学習しました。
変数データ型演算子if文switch文for文while文配列Listメソッドクラスプロパティコンストラクター継承抽象クラスインターフェイス例外処理これらは、どの種類のアプリを作る場合でも必要になる基礎です。
コンソールアプリ、Webアプリ、Windowsフォームアプリのどれを作る場合でも、最終的にはC#のコードを書きます。
中盤:Oracle Database接続
Section titled “中盤:Oracle Database接続”中盤では、C#からOracle Databaseに接続しました。
基本的な流れは次の通りです。
接続文字列を用意する ↓OracleConnectionで接続する ↓OracleCommandでSQLを実行する ↓OracleDataReaderで結果を読み取る ↓オブジェクトに変換する ↓List<T>として返すこの流れは、コンソールアプリでも、Webアプリでも、Windowsフォームアプリでも共通でした。
後半:WebアプリとWindowsフォームアプリ
Section titled “後半:WebアプリとWindowsフォームアプリ”後半では、2種類の画面アプリを体験しました。
ASP.NET Core MVC → ブラウザーで利用するWebアプリ
Windowsフォームアプリ → Windows上で動くデスクトップアプリ表示方法は違いますが、どちらも次の流れは共通しています。
入力を受け取る ↓必要な処理を行う ↓DBに問い合わせる ↓結果を画面に表示する25-2 コンソールアプリ、Webアプリ、Windowsフォームアプリの違い
Section titled “25-2 コンソールアプリ、Webアプリ、Windowsフォームアプリの違い”コンソールアプリ
Section titled “コンソールアプリ”コンソールアプリは、文字入力と文字表示を中心に動きます。
Mainメソッドから始まる上から順番に処理されるConsole.WriteLineで表示するConsole.ReadLineで入力する学習初期には、処理の流れを理解しやすいという利点があります。
Webアプリ
Section titled “Webアプリ”Webアプリは、ブラウザーからアクセスして利用します。
ASP.NET Core MVCでは、次の役割に分かれます。
Controller リクエストを受け取り、処理の流れを決める
Model 画面で扱うデータを表す
View HTMLとして画面を表示する
Repository DBアクセス処理を担当するWebアプリでは、URL、Controller、Viewの対応関係を意識することが重要です。
Windowsフォームアプリ
Section titled “Windowsフォームアプリ”Windowsフォームアプリは、画面上の部品を操作して利用します。
FormButtonTextBoxLabelDataGridViewMessageBox処理は、ボタンクリックなどのイベントをきっかけに実行されます。
ボタンをクリックする ↓クリックイベントが実行される ↓DB処理や画面表示を行うWindowsフォームアプリでは、画面部品の Name とコードの対応を意識することが重要です。
25-3 クラス設計の振り返り
Section titled “25-3 クラス設計の振り返り”クラスは役割ごとに分ける
Section titled “クラスは役割ごとに分ける”この研修では、さまざまなクラスを作成しました。
EmployeeEmployeeListItemEmployeeDetailEmployeeEditModelEmployeeRepositoryそれぞれの役割は異なります。
| クラス | 主な役割 |
|---|---|
Employee | 社員そのものを表す |
EmployeeListItem | 一覧表示用の1行分を表す |
EmployeeDetail | 詳細表示用のデータを表す |
EmployeeEditModel | 登録・更新入力用のデータを表す |
EmployeeRepository | DBアクセス処理を担当する |
同じ社員情報でも、画面や処理によって必要な形が異なります。
そのため、用途に応じてクラスを分けることがあります。
プロパティとメソッド
Section titled “プロパティとメソッド”クラスには、プロパティとメソッドを定義できます。
public class Employee{ public int EmployeeId { get; set; } public string EmployeeName { get; set; } = "";
public string GetDisplayText() { return $"{EmployeeId}:{EmployeeName}"; }}プロパティは、データを表します。
EmployeeIdEmployeeNameDepartmentNameSalaryメソッドは、処理を表します。
GetDisplayTextGetEmployeeListItemsInsertUpdateDelete現場でコードを読むときは、まず次のように確認します。
このクラスは何を表しているかどのプロパティを持っているかどのメソッドが何をしているか25-4 DBアクセス処理の振り返り
Section titled “25-4 DBアクセス処理の振り返り”SELECTの流れ
Section titled “SELECTの流れ”SELECT文を実行するときは、主に次のクラスを使いました。
OracleConnectionOracleCommandOracleDataReader流れは次の通りです。
using (OracleConnection connection = new OracleConnection(_connectionString)){ connection.Open();
using (OracleCommand command = new OracleCommand(sql, connection)) using (OracleDataReader reader = command.ExecuteReader()) { while (reader.Read()) { // 1行分のデータを読み取る } }}ExecuteReader は、SELECT結果を読み取るときに使います。
INSERT、UPDATE、DELETEの流れ
Section titled “INSERT、UPDATE、DELETEの流れ”登録・更新・削除では、ExecuteNonQuery を使いました。
int count = command.ExecuteNonQuery();主に次のSQLで使います。
INSERTUPDATEDELETEUPDATE や DELETE では、処理された行数を確認できます。
1 1件処理された
0 対象データが見つからなかったDBNull.Value
Section titled “DBNull.Value”DBのNULLは、C#では DBNull.Value として扱います。
DBから読み取るとき:
employee.Salary = reader["salary"] == DBNull.Value ? null : Convert.ToDecimal(reader["salary"]);DBへNULLを渡すとき:
command.Parameters.Add("salary", OracleDbType.Decimal).Value = employee.Salary.HasValue ? employee.Salary.Value : DBNull.Value;DBを扱うときは、NULLの扱いを常に意識します。
25-5 既存システムを読むときの観点
Section titled “25-5 既存システムを読むときの観点”現場では、新規開発だけでなく、既存システムの改修や調査を行うことが多くあります。
そのときは、いきなり全体を理解しようとせず、次の観点で少しずつ確認します。
まず画面から見る
Section titled “まず画面から見る”利用者に見えている画面から確認します。
どの画面かどのボタンかどの入力欄かどの一覧かWindowsフォームアプリなら、フォームとコントロール名を確認します。
Webアプリなら、URL、Controller、Viewを確認します。
次にイベントやActionを見る
Section titled “次にイベントやActionを見る”画面操作に対応する処理を確認します。
Windowsフォームアプリ:
btnSearch_ClickbtnInsert_ClickbtnUpdate_ClickbtnDelete_ClickWebアプリ:
IndexDetailsCreateEditDeleteどの操作でどのメソッドが動くかを確認します。
次にRepositoryを見る
Section titled “次にRepositoryを見る”DBにアクセスしている処理を確認します。
GetEmployeeListItemsFindByIdInsertUpdateDeleteRepositoryでは、次の点を確認します。
どのSQLを実行しているかどのテーブルを使っているかどの列を取得しているかどの条件で検索しているかどのパラメーターを使っているかNULLをどう扱っているかエラーが起きたときの確認
Section titled “エラーが起きたときの確認”エラーが起きた場合は、次の順番で確認します。
エラーメッセージを読むどの操作で起きたか確認するどのメソッドで起きたか確認するSQLを確認するSQL*Plusで同じSQLを試す入力値を確認するDBの制約を確認する特にOracleでは、ORA- で始まるエラー番号が重要です。
25-6 Git提出の振り返り
Section titled “25-6 Git提出の振り返り”この研修では、日々の成果をGitで提出してきました。
基本操作は次の通りです。
git statusgit add .git commit -m "メッセージ"git pushGitは、現場でも非常によく使われます。
この研修では高度なブランチ操作までは扱いませんでしたが、少なくとも次の習慣は重要です。
作業したら状態を確認する意味のある単位でcommitする提出や共有のためにpushするエラーが出たら内容を確認する自己判断で無理に進めすぎない25-7 到達確認演習について
Section titled “25-7 到達確認演習について”この章の最後に、個人で到達確認演習を行います。
目的は、完成度を競うことではありません。
次の力を確認することが目的です。
仕様を読んで作業できるか既存コードを参考にできるかDBからデータを取得できるか画面に表示できるか入力値をチェックできるかエラー時に確認できるかGitで提出できるか制限時間内に、できたところまでを提出します。
未完成でも構いません。
大切なのは、次のことを説明できることです。
どこまでできたかどこで詰まったかどのエラーが出たか次に何を確認すべきか25-8 到達確認演習A:部署一覧表示アプリ
Section titled “25-8 到達確認演習A:部署一覧表示アプリ”Oracle Databaseの departments 表を利用して、部署一覧を表示するアプリを作成してください。
WebアプリまたはWindowsフォームアプリのどちらで作成しても構いません。
講師から指定がある場合は、指定された形式で作成してください。
使用する表は departments です。
主な列:
department_iddepartment_namemanager_id次の機能を作成してください。
部署一覧を表示する部署IDを表示する部署名を表示する管理者IDを表示する表示例:
1:総務:管理者ID 10012:営業:管理者ID 10023:開発:管理者ID 1003Webアプリで作成する場合
Section titled “Webアプリで作成する場合”次の構成を参考にしてください。
DepartmentsControllerDepartmentListItemDepartmentRepositoryViews/Departments/Index.cshtml処理の流れ:
/Departments にアクセスする ↓DepartmentsController.Index が呼ばれる ↓DepartmentRepository.GetDepartmentListItems が呼ばれる ↓departments表をSELECTする ↓Viewで一覧表示するWindowsフォームアプリで作成する場合
Section titled “Windowsフォームアプリで作成する場合”次の構成を参考にしてください。
Form1DepartmentListItemDepartmentRepositoryDataGridView処理の流れ:
一覧表示ボタンをクリックする ↓DepartmentRepository.GetDepartmentListItems が呼ばれる ↓departments表をSELECTする ↓DataGridViewに表示する25-9 到達確認演習B:社員検索機能の追加
Section titled “25-9 到達確認演習B:社員検索機能の追加”既存の社員一覧アプリに、検索機能を追加してください。
WebアプリまたはWindowsフォームアプリのどちらで作成しても構いません。
次の検索条件を1つ以上実装してください。
社員名で部分一致検索部署IDで検索給与が未設定の社員だけを表示余裕があれば、複数条件を組み合わせてください。
SQL例:社員名検索
Section titled “SQL例:社員名検索”SELECT e.employee_id, e.employee_name, d.department_name, e.hiredate, e.salaryFROM employees e JOIN departments d ON e.department_id = d.department_idWHERE e.employee_name LIKE :keywordORDER BY e.employee_idC#側では、前後に % を付けます。
command.Parameters.Add("keyword", OracleDbType.Varchar2).Value = "%" + keyword + "%";SQL例:部署ID検索
Section titled “SQL例:部署ID検索”WHERE e.department_id = :departmentId部署IDは整数として受け取ります。
int.TryParse(input, out int departmentId)SQL例:給与未設定
Section titled “SQL例:給与未設定”WHERE e.salary IS NULLDBのNULLを検索する場合は、= NULL ではなく IS NULL を使います。
25-10 到達確認演習C:小さなCRUD機能
Section titled “25-10 到達確認演習C:小さなCRUD機能”余裕がある人は、社員情報の登録、更新、削除のいずれか1つを追加してください。
すべてを完成させる必要はありません。
まずは1つの操作を確実に動かすことを目標にします。
次の中から1つ以上選んでください。
社員を1件登録する社員名を更新する社員を1件削除するINSERT INTO employees ( employee_id, employee_name, yomi, job_id, manager_id, hiredate, salary, commission, department_id )VALUES ( :employeeId, :employeeName, :yomi, :jobId, :managerId, :hireDate, :salary, :commission, :departmentId )UPDATE employeesSET employee_name = :employeeNameWHERE employee_id = :employeeIdDELETE FROM employeesWHERE employee_id = :employeeId削除処理を作成する場合は、確認メッセージを表示してください。
25-11 到達確認演習の進め方
Section titled “25-11 到達確認演習の進め方”この演習の制限時間は 120分 です。
時間内に完成しなくても構いません。
できたところまでを提出してください。
次の流れで進めてください。
1. どの課題に取り組むか決める2. 画面または機能の構成を考える3. 必要なModelを作る4. Repositoryを作る5. 画面からRepositoryを呼び出す6. 動作確認する7. Gitに提出する8. 振り返りメモを書く作業中に困った場合
Section titled “作業中に困った場合”困った場合は、次の順番で確認してください。
エラーメッセージを読む対象のファイルを確認する直前に変更した箇所を確認するSQL*PlusでSQLを確認する入力値が想定通りか確認する講師に質問する質問するときは、次の情報を伝えます。
何をしようとしていたかどの画面・どのボタンかどのエラーが出たかどこまで確認したか25-12 提出物
Section titled “25-12 提出物”到達確認演習では、次の内容を提出してください。
作成したプロジェクトGitへのcommit、push振り返りメモ振り返りメモは、Markdownファイルとして作成します。
ファイル名例:
final_reflection.md振り返りメモの内容
Section titled “振り返りメモの内容”次の内容を書いてください。
# 最終演習 振り返り
## 取り組んだ課題
例:到達確認演習A 部署一覧表示アプリ
## できたこと
- 部署一覧をDBから取得できた- DataGridViewに表示できた
## 難しかったこと
- OracleDataReaderから値を取り出すところ- DataGridViewの列見出し変更
## エラーと対応
- ORA-xxxxx が出た- SQL*PlusでSQLを確認した
## 今後復習したいこと
- SQLパラメーター- nullの扱い- MVCのControllerとViewの対応25-13 評価の観点
Section titled “25-13 評価の観点”この演習では、完成度だけでなく、次の観点を確認します。
| 観点 | 内容 |
|---|---|
| 仕様理解 | 指示された内容を読んで作業できているか |
| 基本文法 | C#の基本的な構文を使えているか |
| クラス利用 | ModelやRepositoryを分けて使えているか |
| DB接続 | Oracle Databaseに接続し、SQLを実行できているか |
| 画面表示 | 取得したデータを画面に表示できているか |
| 入力チェック | 必要な入力チェックができているか |
| 例外対応 | エラー時にメッセージ確認できているか |
| Git提出 | commit、pushできているか |
| 振り返り | 自分の状況を説明できているか |
すべてを完璧に満たす必要はありません。
現時点でどこまでできるかを確認し、今後の学習につなげることが大切です。
よくあるつまずき
Section titled “よくあるつまずき”| つまずき | 原因 | 対応 |
|---|---|---|
| 何から始めればよいか分からない | 全体を一度に考えている | まず一覧表示だけ作る |
| SQLは合っているのに画面に出ない | 画面側に渡していない | Repositoryの戻り値と画面表示処理を確認する |
| Oracle接続でエラーになる | DB起動や接続文字列の問題 | SQL*Plusで接続確認する |
| Viewで型エラーになる | @model と渡している型が違う | Controllerの return View(...) を確認する |
| DataGridViewに列が出ない | DataSource が設定されていない | DataSource を確認する |
| NULLでエラーになる | DBNull.Value を確認していない | 変換前にNULL確認する |
| 検索結果が0件になる | SQL条件や入力値が違う | SQL*Plusで同じ条件を試す |
| Gitにpushできない | リモートや認証の問題 | エラーメッセージを確認し講師に相談する |
学んだことチェック
Section titled “学んだことチェック”研修全体を振り返り、次の項目を確認してください。
- C#の基本文法を使って簡単な処理を書ける
- クラス、プロパティ、メソッドの役割を説明できる
-
List<T>を使って複数データを扱える - LINQで一覧を検索・絞り込みできる
- 例外処理の基本を書ける
- Oracle DatabaseにC#から接続できる
- SELECT結果をオブジェクトに変換できる
-
DBNull.Valueを考慮できる - SQLパラメーターを使える
- ASP.NET Core MVCの基本構成を説明できる
- Windowsフォームアプリのイベント処理を説明できる
- DataGridViewに一覧を表示できる
- Repositoryの役割を説明できる
- Gitで成果物を提出できる
- 自分が今後復習すべき内容を説明できる
ペア確認・発表準備
Section titled “ペア確認・発表準備”時間があれば、隣の人または近くの人と、次の内容を説明し合います。
- 今回取り組んだ課題は何ですか。
- どのような機能を作りましたか。
- どのクラスを作成しましたか。
- DBアクセスはどこに書きましたか。
- 一番難しかったところはどこですか。
- エラーが出た場合、どのように確認しましたか。
- 今後、復習したい内容は何ですか。
発表する場合は、完成していない部分があっても構いません。
できたことできなかったこと原因として考えたこと次に確認したいことを説明できることが大切です。
Gitへの提出
Section titled “Gitへの提出”演習が終わったら、できたところまでをGitに提出します。
git statusgit add .git commit -m "Chapter25 最終到達確認演習"git push振り返りメモも忘れずに追加してください。
git add final_reflection.mdgit commit -m "最終演習の振り返りを追加"git pushすでにまとめてcommitしている場合は、1回のcommitでも構いません。
提出前チェックリスト
Section titled “提出前チェックリスト”- 到達確認演習に取り組んだ
- 作成したコードを保存した
- DB接続が必要な場合、SQL*Plusでも確認した
- 画面で動作確認した
- エラーが残っている場合、内容をメモした
-
final_reflection.mdを作成した - Gitにcommitした
- Gitにpushした
- どこまでできたか説明できる
- 今後復習したい内容を説明できる
この章のまとめ
Section titled “この章のまとめ”この章では、C#研修全体を振り返り、到達確認演習に取り組みました。
この研修で学習した内容は、現場でC#の既存システムを読むための土台になります。
特に重要な点は次の通りです。
- C#の基本文法は、どの種類のアプリでも必要になる
- クラスは、役割ごとに分けると読みやすくなる
- DBアクセス処理は、Repositoryなどに分けると見通しがよくなる
- Oracle Database接続では、接続、SQL実行、DataReader、オブジェクト変換の流れが基本になる
- DBのNULLは
DBNull.Valueとして扱う必要がある - SQLに値を渡すときは、文字列連結ではなくSQLパラメーターを使う
- Webアプリでは、Controller、Model、Viewの役割を意識する
- Windowsフォームアプリでは、Form、イベント、DataGridViewの役割を意識する
- エラーが出たときは、エラーメッセージ、SQL、入力値、DB状態を順番に確認する
- Gitで作業内容を提出する習慣は、現場でも重要である
研修終了後も、すべてを一度に理解しようとする必要はありません。
現場では、分からないコードに出会うことが普通です。
そのときに、
処理の入口はどこかどのクラスが何を担当しているかDBアクセスはどこか画面表示はどこかエラーは何を示しているかを一つずつ確認できれば、少しずつ既存システムを読めるようになります。
この研修で作成したコードと、自分の振り返りメモを、今後の復習材料として活用してください。