OITA: Oika's Information Technological Activities

@oika 情報技術的活動日誌。

sqlite-netを使ってMonoでSQLiteを利用する

これまでC#からSQLiteを使うときはSystem.Data.SQLiteを使っていたのだけど、
実はLinuxのMonoで使えねぇよって話だったので*1、代わりを探してました。

ちょっと調べた感じだとMono.Data.Sqliteってのを使っている人が多いみたいだったが
なんかダウンロードできるものが見つからなかったので、
今回はsqlite-netというのを使ってみた。その備忘録でござる。  

1. ダウンロード

NuGetからsqlite-netで検索。または↓ここから。
praeclarum sqlite-net · GitHub

sqlite-netはdllになっているわけではなくて、
SQLite.cs, SQLiteAsync.csというソースファイルが入ってくるので
これをそのまま使えということみたいだ。
今回はSQLite.csのほうだけ使用した。

上のgithubから落とす場合はsrcの中に同じファイルが入ってる。
ついでにexamplesの中のやつももらっておくと良い。

あ、なのでSQLite本体のライブラリは別に入手する必要があります。
Windowsで使う分にはsqlite.orgから
Precompiled Binaries for Windowsのとこのdllのやつを落として、
中のsqlite3.dllを使う。
Linuxについては後述。  

2. System.Data.SQLiteとの差異をチェック

System.Data.SQLiteのほうはADO.NET的な書き方をすればだいたいよろしかったと思うけど、
sqlite-netだと微妙に違って、自分の場合は以下のあたりを変更する必要があった。  

接続方法

SQLiteConnectionにOpenメソッドがなく、コンストラクタ内でいきなりOpenされる。
あと、SQLiteConnectionに渡す接続文字列に「Data Source=」の部分が要らない。  

CommandがDisposableでない

SQLiteCommandっていう、いかにもSystem.Data.Common.DbCommandを継承してそうな
クラスがあるんだけども全然継承してなくて、IDisposableですらない。
これは使いっぱなしでいいのかな。  

Select文が発行できない

これはちょっと定かでないんだけども、DataAdapterとかもらうことができないっぽくて、
データを入れるためにマッピングしたクラスを用意しておいて、
ExecuteQuery, Queryといったメソッドを使えということみたいだ。   使い方はかずきさんのブログが大変参考になります。
WinRTでSQLiteが使えるようになったみたいなので試してみました

3. dllのマッピングを設定

Windowsで動かす場合には、アプリの実行ファイルと同じ場所に
sqlite3.dllを置いておけば良いのだけど、MonoからLinuxで使う場合には、
Linux用のSQLiteライブラリを参照するようにしてやる必要がある*2
(以下、CentOS 5.6の場合)   まず、LinuxにSQLiteがインストールされていなければインストール。
yum -y install sqlite とかやって、3.3.6-5がインストールされた。

それからアプリのapp.configを作って、configurationタグに以下を追加。

<configuration>
    <!-- ※targetにはsqliteライブラリがある場所を指定 -->
    <dllmap dll="sqlite3" target="/usr/local/lib/libsqlite3.so.0"/>
</configuration>

以上!

*1:managed onlyのほうのdllなら使えるよって書いてるとこもあったんだけどうまくいかなかった

*2:Monoのほうで既に設定されている場合は不要かも