Portable Class Library for SQLiteを使ってみた

New open source Portable Class Library for SQLite | MS OpenTech.

Microsoft Open TechからOSSとして、SQLite用のポータブルクラスライブラリが公開されましたので使って見ました。

PCLとは言っても現状は.NET Fx 4.5, Windows 8ストアアプリ, Windows Phone 8用で、.NETは32ビットアプリケーションのみです。ただXamalinが絡んでいるようなのでAndroidとかでも動くようになるかもしれませんね。

使い方ですが、ライブラリ自体はNuGetからインストールします。インストールするとReadmeが表示されるので、そこの指示に従ってプラットフォーム向けのSQLiteのライブラリをSQLiteのサイトからダウンロードし、指示通りに配置します。

Windowsのアプリ向けには、ダウンロードしたZIPファイルからファイルを解凍して、それらのファイルをプロジェクトのフォルダにコピー、VSでビルド時にターゲットのフォルダにコピーされるように設定します。

さて、このライブラリですが、ADO.NETのDataProviderではありません。ほぼ忠実にC言語ベースのSQLite APIをラップした物なので、普段慣れているADO.NETでのデーターアクセスのコードは書けません。Entity Frameworkも無し、Linqも無し。

なので、CのAPIをご存じならおなじみの、接続を作る、prepareでステートメントを作る、stepする、結果を確認するという手順です。

コード的にはだいたいこんな様子。

namespace SqlitePclSample
{
    using System;
    using SQLitePCL;

    /// 
    /// SQLitePCLのサンプル
    /// 
    internal class Program
    {
        #region Methods

        private static void Main(string[] args)
        {
            using (var con = new SQLiteConnection("Test.DB"))
            {
                // CREATE TABLE
                SQLiteResult result;
                var stmCreateTable = con.Prepare("CREATE TABLE Test (ID INTEGER, Name TEXT)");
                int loop = 0;
                result = stmCreateTable.Step();
                Console.WriteLine(result.ToString());
                stmCreateTable.Dispose();

                // INSERT
                var stmInsert = con.Prepare("INSERT INTO Test (ID, Name) VALUES(1, 'Tadahiro Ishisaka')");
                result = stmInsert.Step();
                Console.WriteLine(result.ToString());
                stmInsert.Dispose();

                // SELECT
                var stmSelect = con.Prepare("SELECT ID, Name FROM Test");
                stmSelect.Reset();
                do
                {
                    result = stmSelect.Step();
                    if (result == SQLiteResult.ROW)
                    {
                        // どうすればいいの?
                    }
                }
                while (result == SQLiteResult.ROW);
                stmSelect.Dispose();
            }

            Console.ReadLine();
        }

        #endregion
    }
}

そうです。SELECT文自体は実行できる物の、結果から値を取る手段がまだ実装されていません!APIでのsqlite3_column_(型名)関数に当たる物が使える形で実装されていないんですよ。(その2参照)

ということで、がっかり感が否めませんが、基本的なところは出来ていそうなので、生暖かく開発を見守るなり、CodePlexでForkしてPullRequestを投げつけるなりしてみるとよろしいんじゃないでしょうか。

とりあえず現状は使い物に成らないと思うので。

私が見落としていただけだったみたいなので、見落としていた内容はその2に続く。

CodePlexのサイト

いらないとは思いますけど、ソースはgistで公開しています。

https://gist.github.com/ishisaka/a6501013f32b313dca23

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください