SQLiteのテーブルからレコードを取得、検索する - C#

SQLiteのテーブルからレコードを取得、検索するコードを紹介します。

概要

SQLiteのテーブルからレコードを取得、検索するには、SQLのSELECT文を実行します。

プログラム例

UI


コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SQLite;

namespace SimpleSQLiteDemo
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button4_Click(object sender, EventArgs e)
    {
      SQLiteConnection con = new SQLiteConnection("Data Source=mydb.sqlite;Version=3;");
      con.Open();
      try {
        string sql = "select * from products";

        SQLiteCommand com = new SQLiteCommand(sql, con);
        SQLiteDataReader sdr = com.ExecuteReader();
        while (sdr.Read() == true) {
          textBox1.Text += string.Format("id:{0:d}, code:{1}, name:{2}, price:{3:d}\r\n", 
            (int)sdr["id"], (string)sdr["code"], (string)sdr["name"], (int)sdr["price"]);
        }
        sdr.Close();
      }
      finally {
        con.Close();
      }
    }
  }
}

解説

SQLiteConnectionオブジェクトを作成します。
  SQLiteConnection con = new SQLiteConnection("Data Source=mydb.sqlite;Version=3;");

作成した、SQLiteConnectionオブジェクトのOpen()メソッドを呼び出し、SQLiteのデータベースへの接続を開きます。開いた接続は確実に閉じるよう、finallyブロックにSQLiteConnectionオブジェクトのCloseメソッドの呼び出しを記述します。
  con.Open();
  try {
    //...(中略)
  }
  finally {
    con.Close();
  }

tryブロック内の処理でSQL文を実行します。今回はすべてのレコードを取得するSQL文を実行します。
コマンドを実行するための SQLiteCommand を作成します。コンストラクタには、実行するSQL文とSQLiteConnectionオブジェクトを与えます。
今回実行するSQL文はSELECT文のため、結果を返すクエリ文です。SQL文の結果を取得するため、実行はExecuteReaderメソッドを呼び出し、結果セットを取得するためのSQLiteDataReaderオブジェクトを取得します。SQLiteDataReaderオブジェクトはExecuteReaderメソッドの戻り値で取得します。

結果レコードの読出しは、SQLiteDataReaderオブジェクトを利用します。Read()メソッドを呼び出すと最初の結果レコードを読みだせます。フィールドへのアクセスはSQLiteDataReaderオブジェクトの添え字に列名を与えてアクセスします。SQLiteDataReaderオブジェクトで取得できる値はObject型のため、値のキャストか変換が必要になります。
Read()メソッドを再度呼び出すことで次のレコードを取得します。whileループを利用して、Readメソッドの戻り値がfalseになるまで繰り返しレコードを取得することで結果セットのレコードをすべて取得できます。
レコードの取得完了後SQLiteDataReaderオブジェクトのCloseメソッドを呼び出し、DataReaderを閉じます。
  string sql = "select * from products";

  SQLiteCommand com = new SQLiteCommand(sql, con);
  SQLiteDataReader sdr = com.ExecuteReader();
  while (sdr.Read() == true) {
    textBox1.Text += string.Format("id:{0:d}, code:{1}, name:{2}, price:{3:d}\r\n", 
      (int)sdr["id"], (string)sdr["code"], (string)sdr["name"], (int)sdr["price"]);
  }
  sdr.Close();
注意
SQLiteではSQLiteDataReaderをCloseメソッドで閉じないと、SQLiteConnectionを閉じてもデータベースのファイルが開かれたままの状態になり、データベースがロックされた状態となります。SQLiteではSQLiteDataReaderを利用してレコードを読み終わった後には必ずSQLiteDataReaderをCloseします。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


こちらの記事で実装したINSERT文を実行する[button3]をクリックします。


[button4]をクリックして、レコードの内容を表示します。[button3]をクリックして実行したINSERT文のレコードがテキストボックスに表示されることが確認できます。

検索をする場合の例

SQL文を実行して検索をする例を紹介します。先のプログラムでbutton4を下記のコードに変更します。
private void button4_Click(object sender, EventArgs e)
{
  SQLiteConnection con = new SQLiteConnection("Data Source=mydb.sqlite;Version=3;");
  con.Open();
  try {
    string sql = "select * from products where price > 300";

    SQLiteCommand com = new SQLiteCommand(sql, con);
    SQLiteDataReader sdr = com.ExecuteReader();
    while (sdr.Read() == true) {
      textBox1.Text += string.Format("id:{0:d}, code:{1}, name:{2}, price:{3:d}\r\n", 
        (int)sdr["id"], (string)sdr["code"], (string)sdr["name"], (int)sdr["price"]);
    }
    sdr.Close();
  }
  finally {
    con.Close();
  }
}

解説

先のプログラムとの違いは下記コードのSQL部分になります。where句で検索条件を指定しています。
  string sql = "select * from products where price > 300";

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。テーブルが作成され、レコードが挿入された状態で[button4]をクリックします。


今回挿入するレコードは下記になります。レコードの挿入処理はこちらの記事で実装しているコードになります。。
products テーブル
idcodenameprice
1C-001ぺんぎんケーキ380
2C-002らくだカステラ250
3C-003くじらキャンディ160

price のフィールドの値が300以上のレコードが表示されます。

補足:usingを利用した記述方法

例外をキャッチしない場合は、usingを利用するとシンプルにコードを記述できます。

コード例

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SQLite;

namespace SimpleUsingSQLiteDemo
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button4_Click(object sender, EventArgs e)
    {
      using (SQLiteConnection con = new SQLiteConnection("Data Source=mydb.sqlite;Version=3;")) {
        con.Open();

        string sql = "select * from products";

        SQLiteCommand com = new SQLiteCommand(sql, con);
        using (SQLiteDataReader sdr = com.ExecuteReader()) {
          while (sdr.Read() == true) {
            textBox1.Text += string.Format("id:{0:d}, code:{1}, name:{2}, price:{3:d}\r\n",
              (int)sdr["id"], (string)sdr["code"], (string)sdr["name"], (int)sdr["price"]);
          }
        }
      }
    }
    
  }
}

解説

SQLiteConnection オブジェクトを作成するコードをusingで囲むことにより、usingのブロックを抜けた際に自動的にSQLiteConnectionをCloseします。また、SQLiteDataReader オブジェクトを取得するコードをusingで囲むことで、SQLiteDataReaderによる読み込みが終了し、usingのブロックを抜けた時点で自動的にSQLiteDataReaderをCloseします。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-07
作成日: 2018-04-24
iPentec all rights reserverd.