System.Data.SQLiteのラッパ的なもの

System.Data.SQLiteのラッパクラス(改良版)を作ってみました。私のテストが足りていないので、とりあえず正常に動作するところまでは確認していますとしか言いようがないですが。

実物

モノ

SQLiteManager

解説

Visual Studio 2008のプロジェクトファイルが内包されているので、そちらのサンプルを参照してください。

言い訳

実装したこと

こちらで宣言したことがどの程度実装できたかという比較です。

  • 現在では、stringの2次元配列ですが、列名を連想配列に持つ独自クラスにラップしようと考えています。
  • 検索結果に対する処理が出来るメソッドなども実装予定です。
  • Transaction周りを、もう少しスマートにします(トランザクションを明示的に行わない場合は自動でトランザクションが実行されるため、その”自動で実行されることに期待する”構造とする)。
  • もう少し原因を個別にわかりやすくする自前の例外を定義し、投げる。
  • CRUDのついたDBアクセスができるクラスが流行っているようなので、余力と時間があれば、そのうち実装するかもしれない(これが一番未定)。

この項目については実装しました。以前よりスマートになったと思います。ただ、SELECT結果を独自クラスでラップしているので、以前のバージョンより動作が遅くなった可能性があります。使い勝手を取るか、便利さを取るかという所です。

注意点

以前から言っていますが、多くのデータを更新する場合などには、トランザクションの扱いに気をつけてください。

基本的には、サンプルプログラムを読んでいただければ、理解できると思います。

ソースなど

ラップクラスを利用したサンプルプログラム

zip内にも置いていますが、ダウンロードして使用感を確かめるのが面倒だと思う方用です。

class Program
{
    static void Main(string[] args)
    {
        const string db = "test.db";
        
        /* DBファイルを作ります */
        SQLiteConnector.CreateDB(db);

        /* データベースに接続 */
        SQLiteConnector.Connect(db);

        /* テストテーブルを作成 */
        SQLiteConnector.Instance.ExecuteNonQuery("create table book(id integer primary key not null, title text, author text)"); 

        /* 忘れないように:忘れると鬼のように重くなります */
        SQLiteConnector.Instance.TransactionStart();
        
        for (int i = 0; i < 10000; i++)
        {
            /* 試しに、10000件ほどデータを入れてみます */
            /* 興味がある方は、前後の明示的なトランザクションを除けてもやってみてください */
            int n = SQLiteConnector.Instance.ExecuteInsert("insert into book values(null,?,?)", "title" + i % 100, "author" + i);
            Console.WriteLine(n);
        }
        /* 忘れないように */
        SQLiteConnector.Instance.TransactionCommit();

        /* 単体のinsertなどであれば、わざわざトランザクションを明示的に行わなくても、速度的には同じだと思われます */
        SQLiteConnector.Instance.ExecuteNonQuery("insert into book(title, author) values(?,?)", "ttttt", "bbbbb");

        /* SELECTはこのように受け取ります */
        Result result = SQLiteConnector.Instance.ExecuteReader("select book.* from book where title = ?", "title3");

        /* 列名はこのように取得できます */
        Console.WriteLine("{0}\t{1}\t{2}", result.ColumnName[0], result.ColumnName[1], result.ColumnName[2]);

        for (int i = 0; i < result.Length; i++)
        {
            /* このように、列名を入れることで直感的に取得できます。 */
            Console.WriteLine("{0}\t{1}\t{2}", result[i]["id"], result[i]["title"], result[i]["author"]);
        }

        /* 開いたものは閉じましょう */
        SQLiteConnector.Disconnect();

        Console.ReadLine();
    }
}

System.Data.SQLiteのラッパ的なもの」への3件のフィードバック

  1. ピンバック: System.Data.SQLiteの自作ラッパクラス | jikkenjo.net

  2. sinarrow

    こんにちわ。SQLiteManagerを有り難く使わさせてもらっています!

    自分の勘違いだったらすみませんがSQL文を実行するときの引数にLong型の変数は使えませんよね?
    しかしSQLite3自体はlongと同等の値を扱えると記憶しています。
    なので引数にlong型も使えるといいかなぁと思っています。
    実際はlong型の変数を引数にするときにToStringで文字にしてしまえばこのままでも上手く動くので
    とりあえず報告だけしておきました。

  3. oneone

    こちらのSQLiteラッパークラス、ありがたく使わせていただいております。
    テキストに関しては扱えるようになったのですが、画像の取り出しに関して教えていただけないでしょうか?
    格納する方はおそらくできました。

コメントを残す

メールアドレスが公開されることはありません。