使用するSQLiteライブラリは System.Data.SQLite 。
これは、Complete ADO.NET 2.0 Implementation
ということだそうですが、
なにせ、ADO.NETとか使ったこと無いんで案の定ドキュメントあっても引っかかるところがあった...
ので、自分用備忘録として、使い方を載せておきます。
using System;
using System.IO;
using System.Data;
using System.Data.SQLite; // 名前空間のimport
class SampleClass
{
public static void main(string[] args)
{
// コマンドライン引数の1つ目はデータベースファイルへのパスとする。
if ( args.Count != 1 || !File.Exists(args[0]) ) {
Console.WriteLine("usage: <exec> <dbfile>");
return;
}
// データベースコネクションを設定
SQLiteConnectionStringBuilder builder = new SQLiteConnectionStringBuilder();
builder.DataSource = args[0];
SQLiteConnection conn = new SQLiteConnection(builder.ConnectionString);
// 接続
conn.Open();
// Prepared Statementを作成
SQLiteCommand comm1 = conn.CreateCommand();
comm1.CommandText = "INSERT INTO TBL_HOGE VALUES (?, ?)";
// Prepare() は"Does nothing"なので呼ばなくていい
// パラメタを設定
SQLiteParameter param = comm1.CreateParameter();
param.Value = "Hoge";
comm1.Parameters.Add(param);
param = comm1.CreateParameter();
param.Value = 32;
comm1.Parameters.Add(param);
// statement を使いまわす場合は先に Parameters.Clear() しておく
// SELECT以外の実行
// INSERTした行数やらUPDATEした行数やらが返ってくるので
// 必要なら使う。
comm1.ExecuteNonQuery();
// 今度はSELECT
SQLiteCommand comm2 = conn.CreateCommand();
comm2.CommandText = "SELECT * FROM TBL_HOGE";
using ( SQLiteDataReader r = comm2.ExecuteReader() ) {
// r.FieldCount --- 現在のResultSetのカラム数
// r.HasRows --- SELECT結果が1行でもあれば true
// r.Read() --- 次のResultSetを<b>読み込む</b>
// r.NextResult() --- 次のResultSetへ<b>移動する</b>。(移動するだけで読み込んではくれないっぽい)
// 初期rowは最初の結果の1つ前(他の多数のDBライブラリと一緒)
int ridx = 0;
while ( r.Read() ) {
Console.WriteLine("["+ridx+"]");
++ridx;
for ( int i = 0; i < r.FieldCount; ++i ) { // columnのindexは0 origin
Console.WriteLine(" " + r.GetName(i) + " --- " + r.Item[i]);
// もしくはr.Get***() メソッドで型指定で取ってくる。
}
}
}
comm2.Dispose();
comm1.Dispose();
conn.Dispose();
}
}
こんな感じかな。
ちなみに、Parameterの型をちゃんと指定しないとまずい場合は、
SQLiteParameter param = comm.CreateParameter();
param.DbType = System.Data.DbType.Int64
param.Value = 0L;
comm.Paramters.Add(param);
とかやる。 (2008-03-18 基本的に常に指定しなきゃいけないみたい..)
また、SQLiteは基本的に変更即commitなので、Transactionは明示的に
SQLiteTransaction tx = conn.BeginTransaction();
// 何か変更
tx.Commit(); // または tx.Rollback();
とかやる必要あり。
もうひとつおまけ。
SELECT COUNT(*) FROM TABLE など、必ず1列目1行目が取れるような場合には
if ( (Int64)comm.ExecuteScalar() > 0 ) {
// hogehoge
}
とかできる。
- 2008-03-18 2:00
- ParametersのAdd()の引数とExecuteScalar()の戻り値のキャストを修正~ <(_ _)>
- 2008-03-27 1:10
- さらに修正。パラメタ変数はちゃんとSQLiteCommand::CreateParamter() を使って作成しなきゃいけないみたい。
- 2008-04-28
- ちょっとフォーマットを変更





コメントする