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

[!--infotagslink--]

相关文章

  • C#简单访问SQLite数据库的方法(安装,连接,查询等)

    这篇文章主要介绍了C#简单访问SQLite数据库的方法,涉及SQLite数据库的下载、安装及使用C#连接、查询SQLIte数据库的相关技巧,需要的朋友可以参考下...2020-06-25
  • C#中嵌入SQLite数据库的简单方法

    本文给大家介绍的是C#中嵌入SQLite数据库的简单方法,十分的方便也很实用,有需要的小伙伴可以参考下。...2020-06-25
  • C#创建SQLite控制台应用程序详解

    这篇文章主要为大家详细介绍了C#创建SQLite控制台应用程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Sqlite 常用函数 推荐

    Sqlite 常用函数,在实际开发中,经常遇的到。...2020-07-11
  • C#解决SQlite并发异常问题的方法(使用读写锁)

    这篇文章主要介绍了C#解决SQlite并发异常问题的方法,通过使用读写锁达到多线程安全访问,进而解决SQLite并发异常的问题,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C#操作SQLite数据库之读写数据库的方法

    这篇文章主要介绍了C#操作SQLite数据库之读写数据库的方法,简单分析了C#针对SQLite数据库的读写及显示等操作相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧...2020-06-25
  • C# SQLite执行效率的优化教程

    这篇文章主要给大家介绍了关于C# SQLite执行效率优化的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C# SQLite具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • SQLite 入门教程四  增删改查 有讲究

    增删改查操作,其中增删改操作被称为数据操作语言 DML,相对来说简单一点。 查操作相对来说复杂一点,涉及到很多子句,所以这篇先讲增删改操作,以例子为主,后面再讲查操作...2020-07-11
  • php SQLite增删改减实现代码

    db.execsql(sql); 或者db.insert()、db.delete()、db.update(),并且包括数据表的创建和删除等等也可以通过execsql实现 //创建表 代码如下 复制代码 ...2016-11-25
  • C# SQLite事务操作方法分析

    这篇文章主要介绍了C# SQLite事务操作方法,简单分析了使用SQL代码及C#代码实现事务功能的操作技巧,需要的朋友可以参考下...2020-06-25
  • C# SQlite操作方法小结

    这篇文章主要介绍了C# SQlite操作方法,较为详细的讲述了SQLite的下载与C#针对SQLite的连接、创建、与执行SQL语句等操作相关技巧,需要的朋友可以参考下...2020-06-25
  • C#/.Net 中快速批量给SQLite数据库插入测试数据

    这篇文章主要介绍了C#/.Net 中快速批量给SQLite数据库插入测试数据,本文直接给出实例代码,需要的朋友可以参考下...2020-06-25
  • sqlite时间戳转时间语句(时间转时间戳)

    这篇文章主要介绍了sqlite时间戳转时间、时间转时间戳的方法,需要的朋友可以参考下...2020-07-11
  • SQLite教程(二):C/C++接口简介

    这篇文章主要介绍了SQLite教程(二):C/C++接口简介,本文讲解了C/C++接口概述、核心对象和接口、参数绑定等内容,需要的朋友可以参考下...2020-07-11
  • sqlite 数据库连接类

    sqlite 数据库连接类就是利用了php 与sqlite进行连接操作。 代码如下 复制代码 ...2016-11-25
  • python 操作sqlite数据库的方法

    sqlite的官网 sqlite.org/index.html SQLite 作为一个SQL数据库引擎,是由C语言实现的,又小又快,具有高可靠性且功能齐全。 作为嵌入式数据库,在移动设备中使用非常广泛且方便。本文讲解如何使用python操作sqlite数据库...2021-06-23
  • Ionic2调用本地SQlite实例

    这篇文章主要介绍了Ionic2调用本地SQlite实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-04-27
  • C#中增加SQLite事务操作支持与使用方法

    这篇文章主要介绍了C#中增加SQLite事务操作支持与使用方法,结合实例形式分析了C#中针对SQLite事务操作的添加及使用技巧,需要的朋友可以参考下...2020-06-25
  • SQLite教程(四):内置函数

    这篇文章主要介绍了SQLite教程(四):内置函数,本文讲解了聚合函数、核心函数、日期和时间函数、,需要的朋友可以参考下...2020-07-11