SQLiteのヘルパークラス(C#)を作成(改良)したので、アップします。
SQLiteの紹介
SQLiteはMySQLと同じデータベース管理システムです。
サーバとしてではなくアプリケーションに組み込んで利用される軽量のデータベースです。
データは単一のファイルに書き込まれるので、バックアップやリストアはファイルコピーで行えるお手軽さがあります。
System.Data.SQLiteの紹介
System.Data.SQLiteはSQLiteに接続や開発するための.NETライブラリです。
ライブラリを追加するだけで開発者はSQLiteの操作を意識せずに開発することができます。
ヘルパークラスの公開
作成したクラスは、以下で公開されているソースを改良したものです。
http://d.hatena.ne.jp/mftech/20100929/1285754844
特に、複数レコードのInsert処理を楽に行えるようにしています。
レコードは、配列やコレクションとして渡すことが出来ます。
テストコードも含まれているプロジェクトファイルをここからダウンロードできます。
namespace MyTools
{
/// <summary>
/// 機能: SQLite データベース処理の共通クラス
/// 作成者: 2010-04-01 zhoufoxcn(周公)
/// 2011-10-12 Estable
/// Blog: http://zhoufoxcn.blog.51cto.com or http://blog.csdn.net/zhoufoxcn
/// 参考: http://d.hatena.ne.jp/mftech/20100929/1285754844
/// http://blogs.wankuma.com/hatsune/archive/2008/10/16/158915.aspx
/// </summary>
public class SQLiteHelper
{
private string databasePath = string.Empty;
private string connectionString = string.Empty;
/// <summary>
/// コンストラクタ。データベースファイルパスを設定する。
/// </summary>
/// <param name="dbPath">データベースの接続パス</param>
public SQLiteHelper(string dbPath, params string[] options)
{
this.databasePath = dbPath;
this.connectionString = "Data Source=" + dbPath;
if (options != null && options.Length > 0)
{
this.connectionString += ";" + string.Join(";", options);
}
}
/// <summary>
/// データベースファイルが存在するかの bool 値を返す。
/// </summary>
/// <returns>True:存在する, False:存在しない</returns>
public bool ExistDBFile()
{
if (System.IO.File.Exists(this.databasePath))
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// データベースを新規作成
/// </summary>
/// <returns>True:作成した or 既に存在する, False:作成出来なかった</returns>
public bool CreateDB()
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
connection.Close();
}
return ExistDBFile();
}
/// <summary>
/// データベースを削除
/// </summary>
/// <returns>True:削除した or 既に存在しない, False:削除出来なかった</returns>
public bool DeleteDBFile()
{
try
{
System.IO.File.Delete(databasePath);
}
catch { }
return !ExistDBFile();
}
/// <summary>
/// テーブルが存在するかの bool 値を返す。
/// </summary>
/// <param name="tableName">テーブル名</param>
/// <returns>True:存在する, False:存在しない</returns>
public bool ExistTable(string tableName)
{
// データベースファイルが無ければ 例外
if (!ExistDBFile()) throw new SQLiteException(SQLiteErrorCode.CantOpen, "database file is not found");
// システムテーブルからテーブル名を検索する
var sql = "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name=@name";
var parameters = new SQLiteParameter[] {
new SQLiteParameter("@name", tableName),
};
var o = this.ExecuteScalar(sql, parameters);
var i = (o is IConvertible) ? Convert.ToInt32(o, CultureInfo.InvariantCulture) : 0;
return (bool)(i > 0);
}
/// <summary>
/// For a given intrinsic type, return a DbType
/// </summary>
/// <param name="typ">The native type to convert</param>
/// <returns>The corresponding (closest match) DbType</returns>
public static DbType TypeToDBType(Type typ)
{
TypeCode tc = Type.GetTypeCode(typ);
if (tc == TypeCode.Object)
{
if (typ == typeof(byte[])) return DbType.Binary;
if (typ == typeof(Guid)) return DbType.Guid;
return DbType.String;
}
DbType[] _typetodbtype =
{ DbType.Object, DbType.Binary, DbType.Object, DbType.Boolean, DbType.SByte,
DbType.SByte, DbType.Byte, DbType.Int16, DbType.UInt16, DbType.Int32,
DbType.UInt32, DbType.Int64, DbType.UInt64, DbType.Single, DbType.Double,
DbType.Decimal, DbType.DateTime, DbType.Object, DbType.String, };
return _typetodbtype[(int)tc];
}
/// <summary>
/// レコードを追加・削除する SQL 文を実行し、影響行数を返す。
/// </summary>
/// <param name="sql">実行用の SQL 文</param>
/// <param name="parameters">SQL 実行用の引数</param>
/// <returns>SQL により影響を受けた行数</returns>
public int ExecuteNonQuery(string sql)
{
return ExecuteNonQuerys(sql, null);
}
public int ExecuteNonQuery(string sql, params object[] parameters)
{
if (parameters != null && parameters.Count() == 1 && parameters[0] is Array)
{
return ExecuteNonQuerys(sql, new List<IEnumerable<object>> { (IEnumerable<object>)parameters[0], });
}
else
{
return ExecuteNonQuerys(sql, new List<IEnumerable<object>> { parameters, });
}
}
public int ExecuteNonQuerys(string sql, IEnumerable<IEnumerable<object>> parameters)
{
int affectedRows = 0;
using (var connection = new SQLiteConnection(connectionString))
{
connection.Open();
using (var transaction = connection.BeginTransaction())
{
using (var command = new SQLiteCommand(sql, connection))
{
if (parameters != null && parameters.Count() != 0)
{
foreach (var p in parameters)
{
command.Parameters.Clear();
if (p != null && p.Count() != 0)
{
var paramNormalize = p.Select(x =>
{
if (x == null || x is Array)
{
return new SQLiteParameter();
}
else if (x.GetType() == typeof(SQLiteParameter))
{
return (SQLiteParameter)x;
}
else
{
return new SQLiteParameter(TypeToDBType(x.GetType()), x);
}
}).ToArray();
command.Parameters.AddRange(paramNormalize);
}
affectedRows += command.ExecuteNonQuery();
}
}
else
{
affectedRows += command.ExecuteNonQuery();
}
}
transaction.Commit();
}
}
return affectedRows;
}
/// <summary>
/// SQL 文を実行し、検索結果が格納される DataReader を返す
/// </summary>
/// <param name="sql">実行用の SQL 文</param>
/// <param name="parameters">SQL 実行用の引数</param>
/// <returns>検索結果を読取る SQLiteDataReader</returns>
public SQLiteDataReader ExecuteReader(string sql)
{
return ExecuteReader(sql, null);
}
public SQLiteDataReader ExecuteReader(string sql, params object[] parameters)
{
if (parameters != null && parameters.Count() == 1 && parameters[0] is Array)
{
return ExecuteReader(sql, (IEnumerable<object>)parameters[0]);
}
else
{
return ExecuteReader(sql, (IEnumerable<object>)parameters);
}
}
public SQLiteDataReader ExecuteReader(string sql, IEnumerable<object> parameters)
{
var connection = new SQLiteConnection(connectionString);
var command = new SQLiteCommand(sql, connection);
if (parameters != null && parameters.Count() != 0)
{
var paramNormalize = parameters.Select(x =>
{
if (x == null || x is Array)
{
return new SQLiteParameter();
}
else if (x.GetType() == typeof(SQLiteParameter))
{
return (SQLiteParameter)x;
}
else
{
return new SQLiteParameter(TypeToDBType(x.GetType()), x);
}
}).ToArray();
command.Parameters.AddRange(paramNormalize);
}
connection.Open();
var reader = command.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
}
/// <summary>
/// SQL 文を実行し、検索結果が格納される DataTable を返す
/// </summary>
/// <param name="sql">実行用の SQL 文</param>
/// <param name="parameters">SQL 実行用の引数</param>
/// <returns>検索結果を格納した DataTable</returns>
public DataTable ExecuteDataTable(string sql)
{
return ExecuteDataTable(sql, null);
}
public DataTable ExecuteDataTable(string sql, params object[] parameters)
{
if (parameters != null && parameters.Count() == 1 && parameters[0] is Array)
{
return ExecuteDataTable(sql, (IEnumerable<object>)parameters[0]);
}
else
{
return ExecuteDataTable(sql, (IEnumerable<object>)parameters);
}
}
public DataTable ExecuteDataTable(string sql, IEnumerable<object> parameters)
{
using (var connection = new SQLiteConnection(connectionString))
{
using (var command = new SQLiteCommand(sql, connection))
{
if (parameters != null && parameters.Count() != 0)
{
var paramNormalize = parameters.Select(x =>
{
if (x == null || x is Array)
{
return new SQLiteParameter();
}
else if (x.GetType() == typeof(SQLiteParameter))
{
return (SQLiteParameter)x;
}
else
{
return new SQLiteParameter(TypeToDBType(x.GetType()), x);
}
}).ToArray();
command.Parameters.AddRange(paramNormalize);
}
var adapter = new SQLiteDataAdapter(command);
var data = new DataTable();
data.Locale = CultureInfo.InvariantCulture;
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)
{
return ExecuteScalar(sql, null);
}
public object ExecuteScalar(string sql, params object[] parameters)
{
if (parameters != null && parameters.Count() == 1 && parameters[0] is Array)
{
return ExecuteScalar(sql, (IEnumerable<object>)parameters[0]);
}
else
{
return ExecuteScalar(sql, (IEnumerable<object>)parameters);
}
}
public object ExecuteScalar(string sql, IEnumerable<object> parameters)
{
using (var connection = new SQLiteConnection(connectionString))
{
using (var command = new SQLiteCommand(sql, connection))
{
if (parameters != null && parameters.Count() != 0)
{
var paramNormalize = parameters.Select(x =>
{
if (x == null || x is Array)
{
return new SQLiteParameter();
}
else if (x.GetType() == typeof(SQLiteParameter))
{
return (SQLiteParameter)x;
}
else
{
return new SQLiteParameter(TypeToDBType(x.GetType()), x);
}
}).ToArray();
command.Parameters.AddRange(paramNormalize);
}
connection.Open();
return command.ExecuteScalar();
}
}
}
/// <summary>
/// データ型情報の取得
/// </summary>
/// <returns></returns>
public DataTable GetSchema()
{
using (SQLiteConnection connection = new SQLiteConnection(connectionString))
{
connection.Open();
DataTable data = connection.GetSchema("TABLES");
connection.Close();
return data;
}
}
}
}


コメント