System.Data.SQLite 実用サンプルの紹介
こんにちは、chujiangleiです。
System.Data.SQLiteの実装をやってみました。
今回は、System.Data.SQLiteの使用方法、実用サンプルをまとめ、紹介させて頂きます。
SQLiteの紹介
SQLiteはMySQLやPostgreSQLと同じデータベース管理システムであるが、
サーバとしてではなくアプリケーションに組み込んで利用される軽量のデータベースです。
SQLiteはC言語で書かれたので、メモリ管理にはよくできました。
レコード数が10万件以下の場合、検索速度が非常に速いです。
System.Data.SQLiteの紹介
System.Data.SQLiteはSQLiteに接続や開発するための.NETライブラリです。
ライブラリを追加するだけで開発者はSQLiteの操作を意識せずに開発することができます。
下記のビデオを参考すれば、Visual Studio 2005, Visual Studio 2008に簡単に実装できます。
ビデオ: http://sqlite.phxsoftware.com/sqlite.wmv
大規模な開発にはお勧めしないけど、AndroidやWindows 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 <= 'Z'; c++) { for (int i = 0; i < 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)); } } } } }