WinForms と SQLite で作る Person 管理アプリケーション ~ チュートリアル
1. はじめに
このチュートリアルでは、WinForms アプリケーション内で SQLite データベースを利用し、氏名(Name)と電話番号(PhoneNumber)のプロパティを持つ Person クラスのデータを管理する方法を解説します。
具体的には、以下の内容を扱います。
- Person クラスの作成
氏名と電話番号を保持するシンプルなモデルクラスを作成します。 - DataAccess クラスの実装
SQLite データベースの初期化、データの追加、一覧取得、削除、全削除の各処理を実装します。 - Form1 の実装
DataGridView を利用してデータを表示し、テキストボックスとボタンでデータの追加、削除、全削除を実行するフォームを作成します。
2. 必要な環境
- Visual Studio (C# 開発環境)
- .NET Framework または .NET Core の WinForms プロジェクト
- NuGet パッケージ Microsoft.Data.Sqlite のインストール
- NeGetパッケージUno.UIのインストール
このサンプルはテンプレートとして、Windows フォームアプリ(.NET)で作成していますが、Windows フォームアプリケーション(.NET Framework)でも動作します
3. Person クラスの作成
まず、データモデルとして Person クラスを作成します。
このクラスは、各レコードの識別子(Id)、氏名(Name)、電話番号(PhoneNumber)のプロパティを持ちます。
namespace SQLitePlayerClassSample
{
class Person
{
public int Id { get; set; } // 自動採番される主キー
public string Name { get; set; } // 氏名
public string PhoneNumber { get; set; } // 電話番号
}
}
4. DataAccess クラスの実装
次に、SQLite データベースとのやり取りを行う DataAccess クラスを作成します。
このクラスでは、以下の操作を実装します。
- データベース・テーブルの初期化
Persons テーブルが存在しない場合は作成する。 - データの追加
Person オブジェクトの情報をテーブルに追加する。 - データの一覧取得
テーブル内の Person 情報を List<Person> として取得する。 - 特定レコードの削除
選択された Person を Id をキーに削除する。 - 全データの削除
Persons テーブル内のすべてのレコードを削除する。
using Microsoft.Data.Sqlite;
using Windows.Storage;
namespace SQLitePlayerClassSample
{
class DataAccess
{
// データベースと Persons テーブルの初期化(テーブルが存在しなければ作成)
public async static Task InitializeDatabaseAsync()
{
await ApplicationData.Current.LocalFolder.
CreateFileAsync("sqlitePersons.db", CreationCollisionOption.OpenIfExists);
// データベースファイルのパス(Persons 情報用)
string dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqlitePersons.db");
using (var db = new SqliteConnection($"Filename={dbPath}"))
{
db.Open();
string tableCommand = "CREATE TABLE IF NOT EXISTS Persons (" +
"Id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"Name NVARCHAR(100) NOT NULL, " +
"PhoneNumber NVARCHAR(50) NOT NULL)";
using (var createTable = new SqliteCommand(tableCommand, db))
{
createTable.ExecuteNonQuery();
}
}
}
// Person 情報の追加
public static void AddPerson(Person person)
{
// データベースファイルのパス(Persons 情報用)
string dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqlitePersons.db");
using (var db = new SqliteConnection($"Filename={dbPath}"))
{
db.Open();
string insertCommand = "INSERT INTO Persons (Name, PhoneNumber) VALUES (@Name, @PhoneNumber)";
using (var command = new SqliteCommand(insertCommand, db))
{
command.Parameters.AddWithValue("@Name", person.Name);
command.Parameters.AddWithValue("@PhoneNumber", person.PhoneNumber);
command.ExecuteNonQuery();
}
}
}
// Person 情報の一覧を取得
public static List<Person> GetPersons()
{
var persons = new List<Person>();
// データベースファイルのパス(Persons 情報用)
string dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqlitePersons.db");
using (var db = new SqliteConnection($"Filename={dbPath}"))
{
db.Open();
string selectCommand = "SELECT Id, Name, PhoneNumber FROM Persons";
using (var command = new SqliteCommand(selectCommand, db))
{
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
persons.Add(new Person()
{
Id = reader.GetInt32(0),
Name = reader.GetString(1),
PhoneNumber = reader.GetString(2)
});
}
}
}
}
return persons;
}
// 指定した Person を削除(ここでは Id をキーに削除)
public static void DeletePerson(int personId)
{
// データベースファイルのパス(Persons 情報用)
string dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqlitePersons.db");
using (var db = new SqliteConnection($"Filename={dbPath}"))
{
db.Open();
string deleteCommand = "DELETE FROM Persons WHERE Id = @Id";
using (var command = new SqliteCommand(deleteCommand, db))
{
command.Parameters.AddWithValue("@Id", personId);
command.ExecuteNonQuery();
}
}
}
// Persons テーブル内の全データをクリア(テーブル自体は残す)
public static void ClearPersons()
{
// データベースファイルのパス(Persons 情報用)
string dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqlitePersons.db");
using (var db = new SqliteConnection($"Filename={dbPath}"))
{
db.Open();
string deleteAll = "DELETE FROM Persons";
using (var command = new SqliteCommand(deleteAll, db))
{
command.ExecuteNonQuery();
}
}
}
}
}
5. Form1 クラスの実装
最後に、フォーム側のコードを作成します。
このサンプルでは、以下のコントロールを利用します。
- DataGridView (dataGridView1)
登録された Person 情報の一覧を表示します。 - TextBox (txtName)
氏名の入力用。 - TextBox (txtPhone)
電話番号の入力用。 - Button (btnAdd)
Person の追加処理を実行します。 - Button (btnDelete)
DataGridView で選択された Person の削除を実行します。 - Button (btnClear)
Persons テーブル内の全データをクリアします。
以下は、フォームのコード例です。
namespace SQLitePlayerClassSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// フォーム起動時にデータベース初期化& DataGridView の更新
InitializeDatabaseAndLoadData();
}
// 非同期でデータベース初期化& DataGridView のデータ読み込み
private async void InitializeDatabaseAndLoadData()
{
await DataAccess.InitializeDatabaseAsync();
LoadDataIntoDataGridView();
}
// DataGridView に Persons テーブルの情報を読み込む
private void LoadDataIntoDataGridView()
{
var persons = DataAccess.GetPersons();
dataGridView1.DataSource = persons;
}
// 「追加」ボタンのイベントハンドラ:入力された氏名と電話番号を Person として追加
private void btnAdd_Click(object sender, EventArgs e)
{
if (!string.IsNullOrWhiteSpace(txtName.Text) && !string.IsNullOrWhiteSpace(txtPhone.Text))
{
Person person = new Person()
{
Name = txtName.Text,
PhoneNumber = txtPhone.Text
};
DataAccess.AddPerson(person);
LoadDataIntoDataGridView();
txtName.Clear();
txtPhone.Clear();
}
else
{
MessageBox.Show("氏名と電話番号を入力してください。");
}
}
// 「削除」ボタンのイベントハンドラ:DataGridView で選択された行の Person を削除
private void btnDelete_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
// 複数行選択可能な場合、最初の行を対象とする例です
var row = dataGridView1.SelectedRows[0];
if (row.DataBoundItem is Person person)
{
DataAccess.DeletePerson(person.Id);
LoadDataIntoDataGridView();
}
}
else
{
MessageBox.Show("削除する行を選択してください。");
}
}
// 「全削除」ボタンのイベントハンドラ:Persons テーブル内の全データをクリア
private void btnClear_Click(object sender, EventArgs e)
{
DataAccess.ClearPersons();
LoadDataIntoDataGridView();
MessageBox.Show("すべてのデータを削除しました。");
}
}
}
6. まとめ
今回のチュートリアルでは、WinForms アプリケーションで SQLite を利用して、氏名と電話番号を管理する Person クラスのデータを扱う方法を学びました。
具体的には、
- Person クラス を作成してデータモデルを定義
- DataAccess クラス で SQLite データベースの初期化、追加、取得、削除、全削除の処理を実装
- Form1 クラス で DataGridView と各ボタンを用いてデータの表示・操作を実現
この基本構造を応用すれば、より複雑なデータ管理システムも構築できます。各自のプロジェクトに合わせた機能拡張や UI 改良に挑戦してみてください。
以上で、WinForms と SQLite を用いた Person 管理アプリケーションのチュートリアルは終了です。
ディスカッション
コメント一覧
まだ、コメントがありません