SQLite3をC#で使ってみます。
Contents
SQLite3をC#で使う
SQLite3をC#で使うためにはNuGetでSystem.Data.SQLite.Coreをインストールします。コードの上の方に
1 |
using System.Data.SQLite; |
が必要です。
SQLite3のバージョンを表示
まずSQLite3のファイルを作成しなければなりません。以下のコードは実行ファイルがあるフォルダ内にデータベースtest.dbを作成してSQLite3のバージョンを表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public partial class Form1 : Form { void CheckVersion() { SQLiteConnectionStringBuilder sqlConnectionSb = new SQLiteConnectionStringBuilder { DataSource = "test.db" }; using (SQLiteConnection cn = new SQLiteConnection(sqlConnectionSb.ToString())) { cn.Open(); using (SQLiteCommand cmd = new SQLiteCommand(cn)) { cmd.CommandText = "select sqlite_version()"; Console.WriteLine(cmd.ExecuteScalar()); // タイトルバーにバージョンを表示 Text = cmd.ExecuteScalar().ToString(); } } } } |
テーブルを作成する
テーブルを作成するためのコードです。テーブルの構成はNode.JSとsqlite3で簡易掲示板もどきを作ると同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public partial class Form1 : Form { void CreateTable() { var sqlConnectionSb = new SQLiteConnectionStringBuilder { DataSource = "test.db" }; using (var cn = new SQLiteConnection(sqlConnectionSb.ToString())) { cn.Open(); using (var cmd = new SQLiteCommand(cn)) { // "create table table_test1("~~")だとすでにテーブルが存在する場合、例外が発生する cmd.CommandText = "create table if not exists table_test1(" + "id integer primary key autoincrement," + "name text ," + "body text ," + "createtime datetime ," + "updatetime datetime)"; cmd.ExecuteNonQuery(); } } } } |
テーブル一覧を表示
テーブルが生成したあとテーブル一覧を表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
public partial class Form1 : Form { void GetTablesName() { SQLiteConnectionStringBuilder sqlConnectionSb = new SQLiteConnectionStringBuilder { DataSource = "test.db" }; using (SQLiteConnection cn = new SQLiteConnection(sqlConnectionSb.ToString())) { cn.Open(); using (SQLiteCommand cmd = new SQLiteCommand(cn)) { cmd.CommandText = "SELECT * FROM sqlite_master"; string table_test1 = ""; using (SQLiteDataReader reader = cmd.ExecuteReader()) { StringBuilder sb = new StringBuilder(); while (reader.Read()) { // テーブルの名前を取得する string name = reader["name"] as string; sb.Append(name + "\n"); // テーブルの名前が"table_test1"のとき // テーブルが作成された時の CREATE TABLE 文を取得する if (name == "table_test1") table_test1 = reader["sql"] as string; } MessageBox.Show(sb.ToString()); MessageBox.Show(table_test1); } } } } } |
データを追加
データを追加します。格納されるデータは名前と本文、作成時刻と最終更新時刻ですが、作成時刻と最終更新時刻はそのときの時刻をセットするだけなので引数は名前と本文だけ渡します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class Form1 : Form { void Insert(string name, string body) { var sqlConnectionSb = new SQLiteConnectionStringBuilder { DataSource = "test.db" }; using (var cn = new SQLiteConnection(sqlConnectionSb.ToString())) { cn.Open(); using (var cmd = new SQLiteCommand(cn)) { // 作成時刻と最終更新時刻は同じ string createtime = "datetime('now', '+9 hours')"; string updatetime = "datetime('now', '+9 hours')"; string str = $"insert into table_test1(name, body, createtime, updatetime) values('{name}', '{body}', {createtime}, {updatetime})"; cmd.CommandText = str; cmd.ExecuteNonQuery(); } } } } |
データを更新
データを更新します。idで更新する行を特定して、名前と本文を変更します。またそのときの時刻を取得して最終更新時刻も変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public partial class Form1 : Form { void Update(int id, string name, string body) { var sqlConnectionSb = new SQLiteConnectionStringBuilder { DataSource = "test.db" }; using (var cn = new SQLiteConnection(sqlConnectionSb.ToString())) { cn.Open(); using (var cmd = new SQLiteCommand(cn)) { if (name != null) { cmd.CommandText = $"update table_test1 set name = '{name}' where id = {id}"; cmd.ExecuteNonQuery(); } if (body != null) { cmd.CommandText = $"update table_test1 set body = '{body}' where id = {id}"; cmd.ExecuteNonQuery(); } if (name != null || body != null) { string updatetime = "datetime('now', '+9 hours')"; cmd.CommandText = $"update table_test1 set updatetime = {updatetime} where id = {id}"; cmd.ExecuteNonQuery(); } } } } } |
データを削除
指定されたidの行を削除します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class Form1 : Form { void Delete(int id) { var sqlConnectionSb = new SQLiteConnectionStringBuilder { DataSource = "test.db" }; using (var cn = new SQLiteConnection(sqlConnectionSb.ToString())) { cn.Open(); using (var cmd = new SQLiteCommand(cn)) { cmd.CommandText = $"delete from table_test1 where id = {id}"; cmd.ExecuteNonQuery(); } } } } |
データを表示
DataGridViewにデータを表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
public partial class Form1 : Form { void ShowData() { var sqlConnectionSb = new SQLiteConnectionStringBuilder { DataSource = "test.db" }; using (var cn = new SQLiteConnection(sqlConnectionSb.ToString())) { cn.Open(); using (var cmd = new SQLiteCommand(cn)) { string query = "SELECT * FROM table_test1"; // 最終更新時刻が新しい順に並べ替えて表示 // query = "select * from table_test1 order by updatetime desc"; // 最終更新時刻が古い順に // query = "select * from table_test1 order by updatetime"; // 名前に「名無し」があるものだけ表示 // query = "select * from table_test1 where name like '%名無し%'"; // 名前に「名無し」がないものだけ表示 // query = "select * from table_test1 where name not like '%名無し%'"; // query = "select * from table_test1 where name like '%名無し%' order by updatetime desc"; // 合わせ技もOK cmd.CommandText = query; using (SQLiteDataReader reader = cmd.ExecuteReader()) { int i = 0; dataGridView1.Rows.Clear(); dataGridView1.Columns.Clear(); while (reader.Read()) { if (i == 0) { string[] names = reader.GetValues().AllKeys; foreach (string name in names) { dataGridView1.Columns.Add(name, name); } } var vs = Enumerable.Range(0, reader.FieldCount).Select(x => reader.GetValue(x).ToString()); dataGridView1.Rows.Add(vs.ToArray()); i++; } } } } } } |
応用編
テキストボックスに文字を入力して[追加][削除][更新]ボタンをクリックするとデータが追加されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
public partial class Form1 : Form { private void ButtonInsert_Click(object sender, EventArgs e) { string newName = textBox1.Text != "" ? textBox1.Text : "名無しさん"; string newBody = textBox2.Text; Insert(newName, newBody); ShowData(); } private void ButtonDelete_Click(object sender, EventArgs e) { // どこも選択されていないときに実行されるかもしれないので例外処理をしている try { DataGridViewCell cell = dataGridView1.SelectedCells[0]; int i = cell.RowIndex; DataGridViewRow row = dataGridView1.Rows[i]; string value = row.Cells[0].Value.ToString(); int id = int.Parse(value); Delete(id); ShowData(); } catch { MessageBox.Show("行が選択されていません"); } } private void ButtonUpdate_Click(object sender, EventArgs e) { try { DataGridViewCell cell = dataGridView1.SelectedCells[0]; int i = cell.RowIndex; DataGridViewRow row = dataGridView1.Rows[i]; string value = row.Cells[0].Value.ToString(); int id = int.Parse(value); string newName = null; string newBody = null; // テキストボックスになにも入力されていない場合は更新しない if (textBox1.Text != "") newName = textBox1.Text; if (textBox2.Text != "") newBody = textBox2.Text; Update(id, newName, newBody); ShowData(); } catch { MessageBox.Show("行が選択されていません"); } } } |