System.Data.SQLite 実用サンプルの紹介

こんにちは、chujiangleiです。
System.Data.SQLiteの実装をやってみました。
今回は、System.Data.SQLiteの使用方法、実用サンプルをまとめ、紹介させて頂きます。

SQLiteの紹介

SQLiteMySQLPostgreSQLと同じデータベース管理システムであるが、
サーバとしてではなくアプリケーションに組み込んで利用される軽量のデータベースです。
SQLiteC言語で書かれたので、メモリ管理にはよくできました。
レコード数が10万件以下の場合、検索速度が非常に速いです。

System.Data.SQLiteの紹介

System.Data.SQLiteSQLiteに接続や開発するための.NETライブラリです。
ライブラリを追加するだけで開発者はSQLiteの操作を意識せずに開発することができます。
下記のビデオを参考すれば、Visual Studio 2005, Visual Studio 2008に簡単に実装できます。
ビデオ: http://sqlite.phxsoftware.com/sqlite.wmv

大規模な開発にはお勧めしないけど、AndroidWindows Mobileの開発もサポートされているので、
10万件以下の小規模開発には便利なツールだと思います。

System.Data.SQLiteの実用サンプル

下記のソースは中国のzhoufoxcnさん(MVP)から提供して頂いたサンプルです。
サンプルの内容はデータベースの基本機能(データ取得、レコード追加・削除)です。
サンプルの説明文を日本語に翻訳させて頂き、
使い方はSystem.Data.Sqlと一緒ですので、ここでは、説明を省略いたします。
皆さん、ご参考くださいませ。

using System.Data;
using System.Data.Common;
using System.Data.SQLite;

namespace SQLiteQueryBrowser
{
    /// <summary>
    /// 機能: データベース処理の共通クラス
  /// 作成者: zhoufoxcn(周公)
    /// 日付: 2010-04-01
    /// Blog: http://zhoufoxcn.blog.51cto.com or http://blog.csdn.net/zhoufoxcn
    /// Version:0.1
    /// </summary>
    public class SQLiteDBHelper
    {
        private string connectionString = string.Empty;
        
        /// <summary>
        /// 接続文字列の設定
        /// </summary>
        /// <param name="dbPath">データベースの接続パス</param>
        public SQLiteDBHelper(string dbPath)
        {
            this.connectionString = "Data Source=" + dbPath;
        }
        
        /// <summary>
        /// データベースの新規作成
        /// </summary>
        /// <param name="dbPath">生成データベースのパス</param>
        public static void CreateDB(string dbPath)
        {
            using (SQLiteConnection connection = new SQLiteConnection("Data Source=" + dbPath))
            {
                connection.Open();
                using (SQLiteCommand command = new SQLiteCommand(connection))
                {
                    command.CommandText = "CREATE TABLE Demo(id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE)";
                    command.ExecuteNonQuery();

                    command.CommandText = "DROP TABLE Demo";
                    command.ExecuteNonQuery();
                }
            }
        }

        /// <summary>
        /// レコードを追加・削除する処理です。影響行数を返す。
        /// </summary>
        /// <param name="sql">実行用のSQL文</param>
        /// <param name="parameters">SQL実行用の引数</param>
        /// <returns></returns>
        public int ExecuteNonQuery(string sql, SQLiteParameter[] parameters)
        {
            int affectedRows = 0;
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                connection.Open();
                using (DbTransaction transaction = connection.BeginTransaction())
                {
                    using (SQLiteCommand command = new SQLiteCommand(connection))
                    {
                        command.CommandText = sql;
                        if (parameters != null)
                        {
                            command.Parameters.AddRange(parameters);
                        }
                        affectedRows = command.ExecuteNonQuery();
                    }
                    transaction.Commit();
                }
            }
            return affectedRows;
        }

        /// <summary>
        /// SQL文を実行し、検索結果が格納されるDataReaderを返す
        /// </summary>
        /// <param name="sql">実行用のSQL文</param>
        /// <param name="parameters">SQL実行用の引数</param>
        /// <returns></returns>
        public SQLiteDataReader ExecuteReader(string sql, SQLiteParameter[] parameters)
        {
            SQLiteConnection connection = new SQLiteConnection(connectionString);
            SQLiteCommand command = new SQLiteCommand(sql, connection);
            if (parameters != null)
            {
                command.Parameters.AddRange(parameters);
            }
            connection.Open();
            return command.ExecuteReader(CommandBehavior.CloseConnection);
        }

        /// <summary>
        /// SQL文を実行し、検索結果が格納されるDataTableを返す
        /// </summary>
        /// <param name="sql">実行用のSQL文</param>
        /// <param name="parameters">SQL実行用の引数</param>
        /// <returns></returns>
        public DataTable ExecuteDataTable(string sql, SQLiteParameter[] parameters)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                using (SQLiteCommand command = new SQLiteCommand(sql, connection))
                {
                    if (parameters != null)
                    {
                        command.Parameters.AddRange(parameters);
                    }
                    SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
                    DataTable data = new DataTable();
                    adapter.Fill(data);
                    return data;
                }
            }
            
        }

        /// <summary>
        /// SQL文を実行し、検索結果の第1行第1列を返す
        /// </summary>
        /// <param name="sql">実行用のSQL文</param>
        /// <param name="parameters">SQL実行用の引数</param>
        /// <returns></returns>
        public Object ExecuteScalar(string sql, SQLiteParameter[] parameters)
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                using (SQLiteCommand command = new SQLiteCommand(sql, connection))
                {
                    if (parameters != null)
                    {
                        command.Parameters.AddRange(parameters);
                    }
                    SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
                    DataTable data = new DataTable();
                    adapter.Fill(data);
                    return data;
                }
            }
        }

        /// <summary>
        /// データ型情報の取得
        /// </summary>
        /// <returns></returns>
        public DataTable GetSchema()
        {
            using (SQLiteConnection connection = new SQLiteConnection(connectionString))
            {
                connection.Open();
                DataTable data=connection.GetSchema("TABLES");
                connection.Close();
                //foreach (DataColumn column in data.Columns)
                //{
                //    Console.WriteLine(column.ColumnName);
                //}
                return data;
            }
        }

    }
}

下記のソースは共通クラスの実際の使用例です。

using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
using SQLiteQueryBrowser;

namespace SQLiteDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //CreateTable();
            //InsertData();
            ShowData();
            Console.ReadLine();
        }

        public static void CreateTable()
        {
            string dbPath = "D:\\Demo.db3";
            //データベースが存在しない場合、DB新規作成を行う
            if (!System.IO.File.Exists(dbPath))
            {
                SQLiteDBHelper.CreateDB("D:\\Demo.db3");
            }
            SQLiteDBHelper db = new SQLiteDBHelper("D:\\Demo.db3");
            string sql = "CREATE TABLE Test3(id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
              Name char(3),TypeName varchar(50),addDate datetime,UpdateTime Date,
              Time time,Comments blob)";
            db.ExecuteNonQuery(sql, null);
        }

        public static void InsertData()
        {
            string sql = "INSERT INTO Test3(Name,TypeName,addDate,UpdateTime,Time,Comments)
              values(@Name,@TypeName,@addDate,@UpdateTime,@Time,@Comments)";
            SQLiteDBHelper db = new SQLiteDBHelper("D:\\Demo.db3");
            for (char c = 'A'; c &lt;= 'Z'; c++)
            {
                for (int i = 0; i &lt; 100; i++)
                {
                    SQLiteParameter[] parameters = new SQLiteParameter[]{
                     new SQLiteParameter("@Name",c+i.ToString()),
                     new SQLiteParameter("@TypeName",c.ToString()),
                     new SQLiteParameter("@addDate",DateTime.Now),
                     new SQLiteParameter("@UpdateTime",DateTime.Now.Date),
                     new SQLiteParameter("@Time",DateTime.Now.ToShortTimeString()),
                     new SQLiteParameter("@Comments","Just a Test"+i)
                    };

                    db.ExecuteNonQuery(sql, parameters);
                }
            }

        }

        public static void ShowData()
        {
            //第50行からの20レコードを表示される
            string sql = "select * from test3 order by id desc limit 50 offset 20";
            SQLiteDBHelper db = new SQLiteDBHelper("D:\\Demo.db3");
            using (SQLiteDataReader reader = db.ExecuteReader(sql, null))
            {
                while (reader.Read())
                {
                    Console.WriteLine("ID:{0},TypeName{1}", reader.GetInt64(0), reader.GetString(1));
                }
            }
        }


    }
}