だらだらやるよ。

こげつのIT技術メモ

C#からSQLiteを使ってみた。

環境はVS2005とC#
SQLServerでデータのCRUDを行う際、SqlDataAdapterと型付データセットをウィザードを使って生成してたのですが
SQLiteで同じことやろうとしてはまりました。


接続用のライブラリにはこれを使いました。
http://sqlite.phxsoftware.com/


まずSQLiteのライブラリがデザイナに追加して使用できない。
これはODBC接続を使って、データセットの作成だけ行いました。
このときに、ウィザードで表示されるテーブル一覧には何も表示されませんが、テーブル名を直打ちすると読み込めました。
でもキー列が認識されない。。。テーブル数少なかったので手で設定しました。*1

でもこのままだとせっかくSQLite用のドライバがあるのに、ODBC経由での接続になってしまうんですよね。。。
文字列置換を使って全部SQLite用のドライバに変更してしまおうか迷ったのですが、デザイナが生成したコードをいじるとなんかあったときに面倒なので中止。
うんうんうなりながらMSDNのDataAdapterを眺めていたら発見しました。

DbCommandBuilderクラス
http://msdn2.microsoft.com/ja-jp/library/system.data.common.dbcommandbuilder(VS.80).aspx
Select文は書かないとだめそうですが、これでなんとかなりそうです。
あ、Update文作るときはテーブル定義も確認するので、キーとなる値がある場合は、ちゃんと制約つけておきましょう。

実際に動かしてみて、データが作られたことを確認。
当然ながらSelect句のパラメータなどは作ってくれないので、
パラメータクエリを使用する場合は、SelectCommandのParametersにAddしてあげる必要があります。

コードはこんな感じ

SQLiteConnection con = new SQLiteConnection(@"Data Source = C:\tmp\db;Version=3;Compress=True;New=True");
SQLiteDataAdapter sda = new new SQLiteDataAdapter("SELECT * FROM table_name WHERE col1 = @col1",con);
sda.SelectCommand.Parameters.Add(new SQLiteParameter("@col1"));
SQLiteCommandBuilder sdb = new SQLiteCommandBuilder(sda);
sda.InsertCommand = sdb.GetInsertCommand(true);
sda.UpdateCommand = sdb.GetUpdateCommand(true);
sda.DeleteCommand = sdb.GetDeleteCommand(true);


もっとMSDNは読まないとだめですね。

*1:ODBCからMSAccessを経由させ、Oleプロバイダでつなぐとテーブル一覧も表示され、キーも作成されました。