C# テキスト接続の深掘り
Tim Coreyの"C#アプリケーションの開始から終了まで"シリーズのレッスン11では、Timがテキストベースのデータ接続を使用してデータをテキストファイルに保存する方法を説明しています。 Timは最初に、前のレッスンでSQL接続を設定し、重要なハウスキーピングタスクを実行したことを視聴者に思い出させます。 今、焦点はテキスト接続に移り、目標は明確です: テキスト接続をSQL接続と同様に機能させることで、システムがPrizeModelを取得して正しくIDを埋め込んで返すことができるようにすることです。 Timはビデオがプレーンテキストファイルを使用したデータの保存、読み取り、更新のための完全なワークフローを示すことを強調しています。
ソリューション - テキスト接続のセットアップ
TimはDataAccessフォルダー内にあるテキストコネクタを開くことから始めます。 彼はサンプルコードを削除し、一から始めます。 彼は、SQLとは異なり、テキストファイルは自動インクリメントIDのようなスマートなデータベース機能を提供しないことを説明しています。 したがって、最初のタスクはテキストファイルをどこに保存するかを決めることです。
Timは、クリーンなデザインを提案します: 各モデルをその独自のテキストファイルに保存します。たとえば、PrizeModelはPrizeModels.csvと呼ばれる独自のファイルを持ち、MatchupModelのような他のモデルもそれぞれ別のファイルを持ちます。 Timはこの構造をSQLテーブルに例えます—各ファイルはそのモデルのリストを含む"テーブル"となります。 これはデータの管理を容易にし、異なるモデルタイプを混在させることを防ぎます。
接続文字列 - ファイルパスの保存
Timは、単一のファイル名を保存する代わりに、すべてのファイルが保存されるフォルダーへのパスを保存することを説明します。 このパスはapp.configのappSettingsに配置されます。 Timは新しいキーと値のペアを追加します。
キー: filePath
- 値: ファイルが保存されるフォルダーのパス
彼は正しいWindows構文を使用し、フルファイルパスを構築する際にスラッシュを追加することを好むので、パスの終わりにスラッシュを付けないことを強調します。 このセットアップは重要であり、ストレージの場所が変わった場合、app.configを更新するだけで済むのでアプリケーションが柔軟になります。
計画 - テキスト接続の働き方
Timは賞を保存するための明確な計画を示しています。
すべての賞を含むテキストファイルを読み込みます。
テキスト行をPrizeModelのリストに変換します。
リスト中の最高のIDを見つけ、新しいID = 最高のID+1に設定します。
新しい賞モデルをリストに追加します。
賞のリストをテキスト行に変換します。
- リストをテキストファイルに保存し、古いデータを上書きします。
Timは、テキストファイルがSQLデータベースと比較して"愚かな"ものであると説明しています。 SQLはIDを自動管理しますが、テキストファイルは開発者が手動でロジックを実装する必要があります。 これはなぜTimがプロセスを小さなメソッドに分けてコードをクリーンで再利用可能にするのかについての説明です。
新しいクラスの作成 - テキストコネクタプロセッサ
TimはTextConnectorProcessorと呼ばれる新しいクラスを作成します。 彼はそれをDataAccessフォルダー内に配置しますが、メインの名前空間を散らかすことを避けるために異なる名前空間に配置します。 Timは名前空間が柔軟でカスタマイズ可能であるが、それらをシンプルでクリーンに保つことを推奨しています。
彼はクラスをpublic staticにし、ヘルパーメソッドの構築を開始します。
拡張メソッド - フルファイルパス
Timは拡張メソッドを作成します。
public static string FullFilePath(this string fileName)このメソッドはapp.configからのfilePathとファイル名を組み合わせてフルファイルパスを生成します。 TimはConfigurationManager.AppSettings["filePath"]の使用方法を示し、C#文字列内でのスラッシュのエスケープ(\の使用)の必要性を説明します。
次に、拡張メソッドとしてメソッドを変換し、次のように使用できるようにします。
"PrizeModels.csv".FullFilePath()Timは、この拡張メソッドがテキストコネクタでのみ必要であるため、ソリューション全体でそれを表示しないように、別の名前空間に保持しています。
ファイルのロードメソッド - テキストデータの読み込み
次に、Timは別の拡張メソッドを作成します。
public static List<string> LoadFile(this string file)このメソッドは、File.Exists()を使用してファイルが存在するかどうかを確認します。 ファイルが存在しない場合、空のリストを返します。存在する場合、File.ReadAllLines()を使用してすべての行を読み取り、リストに変換します。
ティムは、初回実行時にファイルが見つからないことが一般的であるため、適切にファイルを処理することの重要性を強調しています。
テキストを賞モデルに変換
ティムは、読み込んだテキスト行をPrizeModelのリストに変換する方法を作成します。
public static List<PrizeModel> ConvertToPrizeModels(this List<string> lines)各行がカンマで区切られたフィールドを含むCSV(カンマ区切り値)の使用を説明します。 ティムは各行を列に分割し、それを適切なデータ型に解析します。
ID → int.Parse()
PlaceNumber → int.Parse()
PlaceName → string
PrizeAmount → decimal.Parse()
- PrizePercentage → double.Parse()
ティムは、データが無効な場合にはアプリケーションがクラッシュすることを意図的に許可していることを説明します。 これは、破損したデータを続行するのではなく、問題を早期に明らかにするのに役立ちます。
最大IDを見つける
ティムはTextConnectorに戻り、最高のIDを見つける方法を説明します。
int currentID = prizes.OrderByDescending(x => x.ID).First().ID + 1;ファイルが空の場合、このコードがクラッシュするため、チェックを追加します。
if(prizes.Count > 0)
{
currentID = prizes.OrderByDescending(x => x.ID).First().ID + 1;
}これにより、最初のレコードがID 1を取得することが保証されます。
モデルの追加と保存
ティムは新しい賞をリストに追加し、そのリストをテキスト行に再変換します。
public static void SaveToPrizeFile(this List<PrizeModel> models, string fileName)文字列補間を使用して各CSV行を作成し、それを文字列のリストに追加します。 最終的に、利用します。
File.WriteAllLines(fileName.FullFilePath(), lines);WriteAllLinesがファイルを上書きすることを説明し、これはデータが更新された内容でリフレッシュされるため望ましい動作です。
モデルを返す
ティムはメソッドを終え、割り当てられたIDを持つPrizeModelを返します。 これにより、新しい賞がアプリケーションの他の部分で使用できるようになり、SQLのように動作します。
テキスト接続のテスト
ティムはProgram.csに切り替え、データ接続をSQLからテキストに変更します。 アプリケーションを実行し、賞を作成すると、最初はレコードがないためにシステムがクラッシュします。 ティムは、if(prizes.Count > 0)チェックでバグをすぐに修正し、再度実行します。
データが正しくPrizeModels.csvファイルに保存されていることを示し、そのファイルがメモ帳やExcelで開けることを示します。
最終的な考察 — 拡張メソッドと名前空間
ティムは、拡張メソッドは正しい名前空間が含まれている場合にのみ表示されることを視聴者に思い起こさせながら、レッスンを終了します。 これにより、混乱と潜在的な名前の競合を避けることができます。 これらの二つのレッスンがアプリケーションの残りの部分の強力な基盤を築き、将来の開発の舞台を設定します。

