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を愛用
掲載日: 2022-11-22
iPentec all rights reserverd.