これまで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
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>
以上!