C# SQLite实用帮助类:SQLiteHelper
更新时间:2020年5月27日 08:55 点击:1424 作者:pcenshao
SQLite帮助类SQlitehelper 实现对SQLite数据的增删改查
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; using System.Data.SQLite; namespace SQLite { /// <summary> /// SQLite数据库操作帮助类 /// 提供一系列方便的调用: /// Execute,Save,Update,Delete... /// /// 不是线程安全的 /// /// @author pcenshao /// </summary> public class SQLiteHelper { private bool _showSql = true; /// <summary> /// 是否输出生成的SQL语句 /// </summary> public bool ShowSql { get { return this._showSql; } set { this._showSql = value; } } private readonly string _dataFile; private SQLiteConnection _conn; public SQLiteHelper(string dataFile) { if (dataFile == null) throw new ArgumentNullException("dataFile=null"); this._dataFile = dataFile; } /// <summary> /// <para>打开SQLiteManager使用的数据库连接</para> /// </summary> public void Open() { this._conn = OpenConnection(this._dataFile); } public void Close() { if (this._conn != null) { this._conn.Close(); } } /// <summary> /// <para>安静地关闭连接,保存不抛出任何异常</para> /// </summary> public void CloseQuietly() { if (this._conn != null) { try { this._conn.Close(); } catch { } } } /// <summary> /// <para>创建一个连接到指定数据文件的SQLiteConnection,并Open</para> /// <para>如果文件不存在,创建之</para> /// </summary> /// <param name="dataFile"></param> /// <returns></returns> public static SQLiteConnection OpenConnection(string dataFile) { if (dataFile == null) throw new ArgumentNullException("dataFile=null"); if (!File.Exists(dataFile)) { SQLiteConnection.CreateFile(dataFile); } SQLiteConnection conn = new SQLiteConnection(); SQLiteConnectionStringBuilder conStr = new SQLiteConnectionStringBuilder(); conStr.DataSource = dataFile; conn.ConnectionString = conStr.ToString(); conn.Open(); return conn; } /// <summary> /// <para>读取或设置SQLiteManager使用的数据库连接</para> /// </summary> public SQLiteConnection Connection { get { return this._conn; } set { if (value == null) { throw new ArgumentNullException(); } this._conn = value; } } protected void EnsureConnection() { if (this._conn == null) { throw new Exception("SQLiteManager.Connection=null"); } } public string GetDataFile() { return this._dataFile; } /// <summary> /// <para>判断表table是否存在</para> /// </summary> /// <param name="table"></param> /// <returns></returns> public bool TableExists(string table) { if (table == null) throw new ArgumentNullException("table=null"); this.EnsureConnection(); // SELECT count(*) FROM sqlite_master WHERE type='table' AND name='test'; SQLiteCommand cmd = new SQLiteCommand("SELECT count(*) as c FROM sqlite_master WHERE type='table' AND name=@tableName "); cmd.Connection = this.Connection; cmd.Parameters.Add(new SQLiteParameter("tableName", table)); SQLiteDataReader reader = cmd.ExecuteReader(); reader.Read(); int c = reader.GetInt32(0); reader.Close(); reader.Dispose(); cmd.Dispose(); //return false; return c == 1; } /// <summary> /// <para>执行SQL,返回受影响的行数</para> /// <para>可用于执行表创建语句</para> /// <para>paramArr == null 表示无参数</para> /// </summary> /// <param name="sql"></param> /// <returns></returns> public int ExecuteNonQuery(string sql,SQLiteParameter[] paramArr) { if (sql == null) { throw new ArgumentNullException("sql=null"); } this.EnsureConnection(); if (this.ShowSql) { Console.WriteLine("SQL: " + sql); } SQLiteCommand cmd = new SQLiteCommand(); cmd.CommandText = sql; if (paramArr != null) { foreach (SQLiteParameter p in paramArr) { cmd.Parameters.Add(p); } } cmd.Connection = this.Connection; int c = cmd.ExecuteNonQuery(); cmd.Dispose(); return c; } /// <summary> /// <para>执行SQL,返回SQLiteDataReader</para> /// <para>返回的Reader为原始状态,须自行调用Read()方法</para> /// <para>paramArr=null,则表示无参数</para> /// </summary> /// <param name="sql"></param> /// <param name="paramArr"></param> /// <returns></returns> public SQLiteDataReader ExecuteReader(string sql,SQLiteParameter[] paramArr) { return (SQLiteDataReader)ExecuteReader(sql, paramArr, (ReaderWrapper)null); } /// <summary> /// <para>执行SQL,如果readerWrapper!=null,那么将调用readerWrapper对SQLiteDataReader进行包装,并返回结果</para> /// </summary> /// <param name="sql"></param> /// <param name="paramArr">null 表示无参数</param> /// <param name="readerWrapper">null 直接返回SQLiteDataReader</param> /// <returns></returns> public object ExecuteReader(string sql, SQLiteParameter[] paramArr, ReaderWrapper readerWrapper) { if (sql == null) { throw new ArgumentNullException("sql=null"); } this.EnsureConnection(); SQLiteCommand cmd = new SQLiteCommand(sql, this.Connection); if (paramArr != null) { foreach (SQLiteParameter p in paramArr) { cmd.Parameters.Add(p); } } SQLiteDataReader reader = cmd.ExecuteReader(); object result = null; if (readerWrapper != null) { result = readerWrapper(reader); } else { result = reader; } reader.Close(); reader.Dispose(); cmd.Dispose(); return result; } /// <summary> /// <para>执行SQL,返回结果集,使用RowWrapper对每一行进行包装</para> /// <para>如果结果集为空,那么返回空List (List.Count=0)</para> /// <para>rowWrapper = null时,使用WrapRowToDictionary</para> /// </summary> /// <param name="sql"></param> /// <param name="paramArr"></param> /// <param name="rowWrapper"></param> /// <returns></returns> public List<object> ExecuteRow(string sql, SQLiteParameter[] paramArr, RowWrapper rowWrapper) { if (sql == null) { throw new ArgumentNullException("sql=null"); } this.EnsureConnection(); SQLiteCommand cmd = new SQLiteCommand(sql, this.Connection); if (paramArr != null) { foreach (SQLiteParameter p in paramArr) { cmd.Parameters.Add(p); } } if (rowWrapper == null) { rowWrapper = new RowWrapper(SQLiteHelper.WrapRowToDictionary); } SQLiteDataReader reader = cmd.ExecuteReader(); List<object> result = new List<object>(); if (reader.HasRows) { int rowNum = 0; while (reader.Read()) { object row = rowWrapper(rowNum, reader); result.Add(row); rowNum++; } } reader.Close(); reader.Dispose(); cmd.Dispose(); return result; } public static object WrapRowToDictionary(int rowNum, SQLiteDataReader reader) { int fc = reader.FieldCount; Dictionary<string, object> row = new Dictionary<string, object>(); for (int i = 0; i < fc; i++) { string fieldName = reader.GetName(i); object value = reader.GetValue(i); row.Add(fieldName, value); } return row; } /// <summary> /// <para>执行insert into语句</para> /// </summary> /// <param name="table"></param> /// <param name="entity"></param> /// <returns></returns> public int Save(string table, Dictionary<string, object> entity) { if (table == null) { throw new ArgumentNullException("table=null"); } this.EnsureConnection(); string sql = BuildInsert(table, entity); return this.ExecuteNonQuery(sql, BuildParamArray(entity)); } private static SQLiteParameter[] BuildParamArray(Dictionary<string, object> entity) { List<SQLiteParameter> list = new List<SQLiteParameter>(); foreach (string key in entity.Keys) { list.Add(new SQLiteParameter(key, entity[key])); } if (list.Count == 0) return null; return list.ToArray(); } private static string BuildInsert(string table, Dictionary<string, object> entity) { StringBuilder buf = new StringBuilder(); buf.Append("insert into ").Append(table); buf.Append(" ("); foreach (string key in entity.Keys) { buf.Append(key).Append(","); } buf.Remove(buf.Length - 1, 1); // 移除最后一个, buf.Append(") "); buf.Append("values("); foreach (string key in entity.Keys) { buf.Append("@").Append(key).Append(","); // 创建一个参数 } buf.Remove(buf.Length - 1, 1); buf.Append(") "); return buf.ToString(); } private static string BuildUpdate(string table, Dictionary<string, object> entity) { StringBuilder buf = new StringBuilder(); buf.Append("update ").Append(table).Append(" set "); foreach (string key in entity.Keys) { buf.Append(key).Append("=").Append("@").Append(key).Append(","); } buf.Remove(buf.Length - 1, 1); buf.Append(" "); return buf.ToString(); } /// <summary> /// <para>执行update语句</para> /// <para>where参数不必要包含'where'关键字</para> /// /// <para>如果where=null,那么忽略whereParams</para> /// <para>如果where!=null,whereParams=null,where部分无参数</para> /// </summary> /// <param name="table"></param> /// <param name="entity"></param> /// <param name="where"></param> /// <param name="whereParams"></param> /// <returns></returns> public int Update(string table, Dictionary<string, object> entity,string where,SQLiteParameter[] whereParams) { if (table == null) { throw new ArgumentNullException("table=null"); } this.EnsureConnection(); string sql = BuildUpdate(table, entity); SQLiteParameter[] arr = BuildParamArray(entity); if (where != null) { sql += " where " + where; if (whereParams != null) { SQLiteParameter[] newArr = new SQLiteParameter[arr.Length + whereParams.Length]; Array.Copy(arr, newArr, arr.Length); Array.Copy(whereParams, 0, newArr, arr.Length, whereParams.Length); arr = newArr; } } return this.ExecuteNonQuery(sql, arr); } /// <summary> /// <para>查询一行记录,无结果时返回null</para> /// <para>conditionCol = null时将忽略条件,直接执行select * from table </para> /// </summary> /// <param name="table"></param> /// <param name="conditionCol"></param> /// <param name="conditionVal"></param> /// <returns></returns> public Dictionary<string, object> QueryOne(string table, string conditionCol, object conditionVal) { if (table == null) { throw new ArgumentNullException("table=null"); } this.EnsureConnection(); string sql = "select * from " + table; if (conditionCol != null) { sql += " where " + conditionCol + "=@" + conditionCol; } if (this.ShowSql) { Console.WriteLine("SQL: " + sql); } List<object> list = this.ExecuteRow(sql, new SQLiteParameter[] { new SQLiteParameter(conditionCol,conditionVal) }, null); if (list.Count == 0) return null; return (Dictionary<string, object>)list[0]; } /// <summary> /// 执行delete from table 语句 /// where不必包含'where'关键字 /// where=null时将忽略whereParams /// </summary> /// <param name="table"></param> /// <param name="where"></param> /// <param name="whereParams"></param> /// <returns></returns> public int Delete(string table, string where, SQLiteParameter[] whereParams) { if (table == null) { throw new ArgumentNullException("table=null"); } this.EnsureConnection(); string sql = "delete from " + table + " "; if (where != null) { sql += "where " + where; } return this.ExecuteNonQuery(sql, whereParams); } } /// <summary> /// 在SQLiteManager.Execute方法中回调,将SQLiteDataReader包装成object /// </summary> /// <param name="reader"></param> /// <returns></returns> public delegate object ReaderWrapper(SQLiteDataReader reader); /// <summary> /// 将SQLiteDataReader的行包装成object /// </summary> /// <param name="rowNum"></param> /// <param name="reader"></param> /// <returns></returns> public delegate object RowWrapper(int rowNum,SQLiteDataReader reader); }
测试类:
使用TestDrivern.NET
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SQLite; namespace SQLite { class Test { private SQLiteHelper _mgr; public Test() { this._mgr = new SQLiteHelper("sqlite.db"); this._mgr.Open(); } public void TestTableExists() { Console.WriteLine("表test是否存在: " + this._mgr.TableExists("test")); } public void TestExecuteRow() { List<object> list = this._mgr.ExecuteRow("select * from test", null, null); foreach (object o in list) { Dictionary<string, object> d = (Dictionary<string, object>) o; foreach (string k in d.Keys) { Console.Write(k + "=" + d[k] + ","); } Console.WriteLine(); } } public void TestSave() { Dictionary<string, object> entity = new Dictionary<string, object>(); entity.Add("username", "u1"); entity.Add("password", "p1"); this._mgr.Save("test", entity); } public void TestUpdate() { Dictionary<string, object> entity = new Dictionary<string, object>(); entity.Add("username", "u1"); entity.Add("password", "123456"); int c = this._mgr.Update("test", entity, "username=@username", new System.Data.SQLite.SQLiteParameter[] { new SQLiteParameter("username","u1") }); Console.WriteLine(c); } public void TestQueryOne() { Dictionary<string, object> entity = this._mgr.QueryOne("test", "username", "a"); foreach (string k in entity.Keys) { Console.Write(k + "=" + entity[k] + ","); } } public void TestDelete() { int c = this._mgr.Delete("test", "username=@username", new SQLiteParameter[] { new SQLiteParameter("username","a") }); Console.WriteLine("c=" + c); } public static void Test0() { Test t = new Test(); t.TestTableExists(); t.TestExecuteRow(); //t.TestSave(); //t.TestUpdate(); // t.TestQueryOne(); t.TestDelete(); } } }
原文出处:http://www.todayx.org
相关文章
- 这篇文章主要介绍了C#简单访问SQLite数据库的方法,涉及SQLite数据库的下载、安装及使用C#连接、查询SQLIte数据库的相关技巧,需要的朋友可以参考下...2020-06-25
- 本文给大家介绍的是C#中嵌入SQLite数据库的简单方法,十分的方便也很实用,有需要的小伙伴可以参考下。...2020-06-25
- 这篇文章主要为大家详细介绍了C#创建SQLite控制台应用程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- Sqlite 常用函数,在实际开发中,经常遇的到。...2020-07-11
- 这篇文章主要介绍了C#解决SQlite并发异常问题的方法,通过使用读写锁达到多线程安全访问,进而解决SQLite并发异常的问题,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#操作SQLite数据库之读写数据库的方法,简单分析了C#针对SQLite数据库的读写及显示等操作相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧...2020-06-25
- 这篇文章主要给大家介绍了关于C# SQLite执行效率优化的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C# SQLite具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 增删改查操作,其中增删改操作被称为数据操作语言 DML,相对来说简单一点。 查操作相对来说复杂一点,涉及到很多子句,所以这篇先讲增删改操作,以例子为主,后面再讲查操作...2020-07-11
- db.execsql(sql); 或者db.insert()、db.delete()、db.update(),并且包括数据表的创建和删除等等也可以通过execsql实现 //创建表 代码如下 复制代码 ...2016-11-25
- 这篇文章主要介绍了C# SQLite事务操作方法,简单分析了使用SQL代码及C#代码实现事务功能的操作技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C# SQlite操作方法,较为详细的讲述了SQLite的下载与C#针对SQLite的连接、创建、与执行SQL语句等操作相关技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C#/.Net 中快速批量给SQLite数据库插入测试数据,本文直接给出实例代码,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了sqlite时间戳转时间、时间转时间戳的方法,需要的朋友可以参考下...2020-07-11
- 这篇文章主要介绍了SQLite教程(二):C/C++接口简介,本文讲解了C/C++接口概述、核心对象和接口、参数绑定等内容,需要的朋友可以参考下...2020-07-11
- sqlite 数据库连接类就是利用了php 与sqlite进行连接操作。 代码如下 复制代码 ...2016-11-25
- sqlite的官网 sqlite.org/index.html SQLite 作为一个SQL数据库引擎,是由C语言实现的,又小又快,具有高可靠性且功能齐全。 作为嵌入式数据库,在移动设备中使用非常广泛且方便。本文讲解如何使用python操作sqlite数据库...2021-06-23
- 这篇文章主要介绍了Ionic2调用本地SQlite实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-04-27
- 这篇文章主要介绍了C#中增加SQLite事务操作支持与使用方法,结合实例形式分析了C#中针对SQLite事务操作的添加及使用技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了SQLite教程(四):内置函数,本文讲解了聚合函数、核心函数、日期和时间函数、,需要的朋友可以参考下...2020-07-11