LiteDB のコレクション(テーブル)のレコードを変更する - C#
LiteDB のデータベース、テーブルのレコードを変更するコードを紹介します。
プログラム例
UI
ボタンが複数配置されていますが、今回は[Update]のボタン(button6)のみ利用します。
コード
以下のコードを記述します。
using LiteDB;
namespace OperateDB
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button6_Click(object sender, EventArgs e)
{
LiteDatabase ldb = new LiteDatabase("MyDB.db");
ILiteCollection<MyRecord> cl = ldb.GetCollection<MyRecord>("my_table");
MyRecord mr = new MyRecord();
mr.Name = "せいうちアイス";
mr.Code = "PD-008";
mr.Price = 290;
cl.Update(3, mr);
textBox1.Text += "レコードを更新しました。 \r\n";
ILiteQueryable<MyRecord> result = cl.Query();
List<MyRecord> mlist = result.ToList();
foreach (MyRecord m in mlist) {
textBox1.Text += string.Format("{0:d} {1} {2} {3:d}\r\n", m.id, m.Name, m.Code, m.Price);
}
ldb.Dispose();
}
}
}
解説
LiteDatabase オブジェクトの作成と、ILiteCollection オブジェクトの取得はレコードの挿入や、レコードの取得と同様の処理です。
LiteDatabase ldb = new LiteDatabase("MyDB.db");
ILiteCollection<MyRecord> cl = ldb.GetCollection<MyRecord>("my_table");
更新するレコードのMyRecordオブジェクトを作成します。
MyRecord mr = new MyRecord();
mr.Name = "せいうちアイス";
mr.Code = "PD-008";
mr.Price = 290;
コレクションオブジェクトの
Update
メソッドを呼び出し、レコードを更新します。Updateメソッドの第一引数に更新するレコードのIDの値を与えます。
下記コードではID=3のレコードを更新する動作となります。第二引数に更新内容となるオブジェクトを与えます。
cl.Update(3, mr);
更新後のコレクションのレコードの一覧を表示します。
ILiteQueryable<MyRecord> result = cl.Query();
List<MyRecord> mlist = result.ToList();
foreach (MyRecord m in mlist) {
textBox1.Text += string.Format("{0:d} {1} {2} {3:d}\r\n", m.id, m.Name, m.Code, m.Price);
}
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
レコードを挿入し、レコードの値を確認します。
[Update]ボタンをクリックし、レコードを更新します。
更新後のレコードの一覧が表示されます。ID=3 のレコードの値が変更されていることが確認できます。
補足:レコードの一部の値を更新する場合
レコードの一部の値を更新したい場合に以下のコードを記述して実行した場合の動作を確認します。
下記のコードは、id=3のレコードの Price フィールドの値を 480 に更新する処理です。
private void button6_Click(object sender, EventArgs e)
{
LiteDatabase ldb = new LiteDatabase("MyDB.db");
ILiteCollection<MyRecord> cl = ldb.GetCollection<MyRecord>("my_table");
MyRecord mr = new MyRecord();
mr.Price = 480;
cl.Update(3, mr);
textBox1.Text += "レコードを更新しました。 \r\n";
ILiteQueryable<MyRecord> result = cl.Query();
List<MyRecord> mlist = result.ToList();
foreach (MyRecord m in mlist) {
textBox1.Text += string.Format("{0:d} {1} {2} {3:d}\r\n", m.id, m.Name, m.Code, m.Price);
}
ldb.Dispose();
}
上記のコードを実行すると下図の結果になります。
設定したフィールドの値が更新される動作ではなく、設定していないフィールドは空文字に設定されてしまいます。
特定のフィールドの値を更新する場合は、更新元のレコードを取得し、変更部分のみを更新してUpdateする必要があります。
IDの値からレコードを取得する場合は、コレクションオブジェクトの
FindById()
メソッドで取得できます。
private void button8_Click(object sender, EventArgs e)
{
LiteDatabase ldb = new LiteDatabase("MyDB.db");
ILiteCollection<MyRecord> cl = ldb.GetCollection<MyRecord>("my_table");
MyRecord tgr = cl.FindById(3);
MyRecord mr = new MyRecord();
mr.Name = tgr.Name;
mr.Code = tgr.Code;
mr.Price = 480;
cl.Update(3, mr);
textBox1.Text += "レコードを更新しました。 \r\n";
ILiteQueryable<MyRecord> result = cl.Query();
List<MyRecord> mlist = result.ToList();
foreach (MyRecord m in mlist) {
textBox1.Text += string.Format("{0:d} {1} {2} {3:d}\r\n", m.id, m.Name, m.Code, m.Price);
}
ldb.Dispose();
}
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用