ようこそゲストさん

mitc - 日記

2007/06/22(金) C#からSQLiteを使ってみた

はてブ 2007/06/23 14:47 .NETmiff
環境
OSWIndows Vista
Visual Studio2005 + Vistaパッチ
System.Data.SQLite1.0.43.0(SQLite3.40)
SQLite ControlCenter 日本語版v1.02

SQLite

SQLiteについては,Wikipedia参照.
簡単に書くと,ファイルを読み書きする感覚で扱えるRDBMSです.
SQLite公式
http://www.sqlite.org/

System.Data.SQLite

SQLiteは,PHP5に標準添付されているので,PHPのものという意識が強いかもしれません.
しかし,実際にはC言語で書かれておりdll版も存在します.
とはいえそこはアンマネージドコード..NETから直接は呼び出せません.
MeCabの時のようにラッパを作ればいいんですが,私にはラッパを作る知識などが足りていません.

そんなわけで,.NETからSQLiteを呼び出すためのクラスライブラリを紹介します.
System.Data.SQLiteといういかにもそれらしい名前のライブラリは,
単なるラッパではなく,何ともともとC言語で書かれているSQLiteのコードを
C#によってADO.NET2.0に対応するように1から書き直して作られています.*1
まさにSQLite.NETと呼ぶにふさわしいと言えるでしょう.

公式サイトの記載によると次の特徴があるらしいです*2
  • ADO.NET2.0の実装
  • 本家sqlite3.dllとの完全な互換性
  • データベースファイルの可搬性
  • Visual Studio 2005 Design-Timeをサポート
    • Design-Timeってなんなんでしょ……これはわかりませんでした
  • 500kb以下の再頒布可能な単体ファイル
    • 単なるラッパならラッパdllとは別に本家dllも必要ですが,このライブラリは機能を内部に含むので単体で使用できます
  • 暗号化機能をサポート
    • データベースファイル全体を暗号化できます
  • パブリックドメイン
    • 本家SQLiteはパブリックドメインですが,このSystem.Data.SQLiteもパブリックドメインなので商用非商用問わず完全に著作権フリーで使えます
System.Data.SQLite
http://sqlite.phxsoftware.com/

System.Data.SQLiteを使えるようにする

インストールと言っても,実際はdllさえあればいいんですが,
上で良くわからないと書いたDesign-Timeを使えるようにするには,
配布されているインストーラでインストールする必要があるようです.

そんなものはいらないって方と自分のためにこのページの下部にdllとインテリセンスをきかせるためのxmlファイルを圧縮したものを置いておきます.

ダウンロード~インストールは簡単で,公式サイトの右側にある「Downloads」のところにあるリンクから最新版をダウンロードします.
SQLite for ADO.NET 2.0とSQLite for ADO.NET vNextがありますが,選ぶのは前者の SQLite-1.0.43.0-binary.exeです.

ダウンロードしたら,その実行ファイルがインストーラなので画面の指示に従って普通にインストールして下さい.
インストール先のフォルダを開くと色々入っていますが,必要なのはSQLite.NET/binフォルダに入っているSystem.Data.SQLite.DLL(本体)とSystem.Data.SQLite.XML(インテリセンス用定義ファイル)のみです.
これらをSQLiteを使いたい.NETプロジェクトのフォルダにコピーでもして参照に追加すれば使用準備はOK.
参照への追加方法は,本日記のC#から形態素解析器のMeCabを呼び出してみた辺りに書いたりしました.

名前空間は……多分推測通りだと思いますが,System.Data.SQLiteです.わかりやすくていいですね.

System.Data.SQLiteを使ってみる

公式サイトのフォーラムを引用*3
using (SQLiteConnection cnn = new SQLiteConnection("Data Source=mydatabase.db"))
using (SQLiteCommand cmd = cnn.CreateCommand())
{
	cnn.Open();

	// CREATE文の実行
	cmd.CommandText = "CREATE TABLE FOO (ID INTEGER PRIMARY KEY, MyValue NVARCHAR(256))";
	cmd.ExecuteNonQuery(); // Create the table, don't expect returned data

	// INSERT文の実行
	cmd.CommandText = "INSERT INTO FOO (MyValue) VALUES('Hello World')";
	cmd.ExecuteNonQuery();

	// SELECT文の実行
	cmd.CommandText = "SELECT * FROM FOO";
	using (SQLiteDataReader reader = cmd.ExecuteReader())
	{
		while (reader.Read())
		{
			Console.WriteLine(String.Format("ID = {0}, MyValue = {1}", reader[0], reader[1]));
		}
	}
}
SQLiteの接続文字列は,使用するDBファイルを指定するだけです.
その他の使用方法は,ADO.NETに沿っています.
この例を見るに,PRIMARY KEYに何も指定しないでINSERTすると自動的に連番が振られるのかも.
  • System.Data.SQLite - Help - need example for select
  • http://sqlite.phxsoftware.com/forums/thread/3324.aspx

*1 : 2009/07/16:ソースコードをダウンロードして確認したら,内部にC言語で書かれたSQLite本体のソースコードを持っていたのでラッパ+ADO.NET対応を一括で行っているDLLと考えた方が良い?ちょっとわからなかったですがこの表現は間違いだったかも

*2 : 誤訳があるかも…….本家の持つ特徴を書いてある部分は除いてます

*3 : ただしバグがあったので一部修正しているのと,コメントを日本語にしています

SQLite ControlCenter 日本語版

データベースを色々いじっているとデータベースファイルの中身がどうなっているかを覗くためのツールが欲しくなるものです.
値の更新処理をした時に本当に更新されているかを確認したり,
挙動がおかしい時にDBの中身がおかしくなっていないかを確認したり,
テストデータを入れるのに使ったり.

SQL ServerならEnterprise Manager,PostgreSQLならPgAdminなど,
DBMSによって色々なツールが存在しますが,
SQLiteはその性質上簡単にそのようなツールが作れるのでかなりの種類があるようです.
ただ,やっぱり海外産だと日本語の扱いを考慮していなかったりして使えるものが限定されてくるようで…….

とりあえず,今はLite ControlCenter日本語版を使ってます.
これがいいのか悪いのかは他と比較していないのでわかりませんが,とりあえず普通に使えてます.
  • SQLite CVSTrac
  • http://www.sqlite.org/cvstrac/wiki?p=ManagementTools
  • SQLite ControlCenter 日本語版
  • http://www.takke.jp/soft/sqliteccj.html
  • SQLite用ブラウザはTkSQLiteに決定 (bokut.in)
  • http://bokut.in/mt/2007/03/sqlitetksqlite.html

再頒布

ライセンス的に問題無いと判断しましたが,問題アリなら消します.ご連絡を.
一応公式サイトも確認して,最新版が出ているならそちらを使うことをお勧めします.

system_data_sqlite_1_0_43_0.zip:System.Data.SQlite ver.1.0.43.0(2007/06/21)

1: snow 2007年06月26日(火) 午後0時22分

「SQLite Database Browser」も良いですよ。日本語も(一応)通ります。
http://www.moongift.jp/2007/04/sqlite_database_browser/

2: miff 2007年06月29日(金) 午後5時06分

おお,情報ありがとうございます.
また試してみようと思います.

3: モヤット 2009年07月07日(火) 午前7時18分

SQLiteの情報ありがとうございます。
SQLiteを辞書にして、携帯電話のような「つながり予測」をするソフトを週末に作ってみました。
この文章も、このソフトを使って書いています。
感覚的には、半分程度のキー入力で文章を作成する事ができます。

http://m1ohya.hp.infoseek.co.jp/

4: miff 2009年07月08日(水) 午後5時39分

情報を使って頂けてとても嬉しいです.
URLのソフトを使ってみましたが,予測も学習もうまいことやってくれて面白かったです.
ソフトを自作すると不満な点を解消したり自分のための機能を付けられたりして良いですよね.

5: モヤット 2009年07月08日(水) 午後6時56分

試して頂いてありがとうございます。
感想を頂くと、とても嬉しく感じます。
ところで本家のSQLiteでは全文検索ができたと思いますが、
System.Data.SQLiteでも全文検索はできるのでしょうか?

6: モヤット 2009年07月10日(金) 午前6時56分

癖の概念を導入しました。
以前のバージョンでは、過去に使った回数でランキングしていましたが、
それに追加して、癖でもランキングをします。
癖には、長期の癖と短期の癖があります。
長期の癖とは、「できます」と書くのか、「出来ます」と書くのかといった、
その人の長期に渡っての「書き癖」をさします。
短期の癖とは、TPOに合わせた書き方の変化を言います。
例えば、ブログで日記を書いている時などは、
「ですね。」とか「だよね。」といった表現を一時的にするかも知れません。
その時は、候補の一覧で、「ですね。」などが入った文章を上位にランキングします。
短期の癖を使えば、メールを書いている時、日記の時、
論文の時と行った、TPOに合わせた書き方が簡単にできると思います。

7: モヤット 2009年07月10日(金) 午後0時34分

自己レスです。
System.Data.SQLiteでも全文検索ができました。

8: モヤット 2009年07月10日(金) 午後8時14分

全文検索の機能を追加しました。

9: miff 2009年07月16日(木) 午前11時32分

解決されたようで良かったです.

10: モヤット 2009年07月18日(土) 深夜1時18分

今後も有益な情報を提供して頂きたいと思います。
今回は、どうもありがとうございました。
ペコり。

11: miff 2009年08月03日(月) 午後4時35分

遅くなりましたが,書いた記事が誰かの役に立てばこれほど嬉しいことは無いです.
その上面白いソフトを紹介して頂きありがとうございました.
今後も頑張って行きたいと思います.


名前:  非公開コメント   

E-Mail(任意/非公開):
URL(任意):
  • TB-URL  http://mitc.s279.xrea.com/adiary.cgi/046/tb/
  • 組み込みDB System.Data.SQLiteを試す 株ツール開発日記
    組み込みDBのSystem.Data.SQLiteを使ってみました。System.Data.SQLiteは、組み込みDBのSQLiteを.NETから使えるようにしたものらしいです。ただ、SQLiteのラッパーではなく、ADO.NET 2.0用に一からC#で...