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 テーブル
id | code | name | price |
1 | C-001 | ぺんぎんケーキ | 380 |
2 | C-002 | らくだカステラ | 250 |
3 | C-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