C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法

一、背景介绍
SQLite是一个轻量级的关系型数据库,具有体积小,速度快,操作简便,易于集成等优点,在嵌入式设备,移动设备及桌面应用程序等方面得到广泛使用。C#语言作为一个跨平台的编程语言,在各个领域的应用也十分广泛,同时也提供了SQLite数据库的连接方式,提供SQLite连接C#的API。虽然C#提供了一些SQLite的API,但是操作SQLite数据库仍然比较繁琐,不能像操作SQL SERVER数据库那样简单便捷。因此,我们需要封装SQLite API来减少我们的编码量。

二、实现方法
SQLiteHelper是一个对SQLite ADO.NET的数据库操作类库,提供了很多方便的方法帮助我们完成SQLite的数据操作。它可以极大程度地减少开发者的编码量。

  1. 导入SQLiteHelper类库
    创建一个类库项目,将SQLiteHelper.cs文件拷贝至该项目根目录后添加。在该类库项目中modify AssemblyInfo.cs文件,使该类集合能够被引用到其他项目中。
  [assembly: AssemblyTitle("SQLiteHelper")]
  [assembly: AssemblyDescription("")]
  [assembly: AssemblyConfiguration("")]
  [assembly: AssemblyCompany("")]
  [assembly: AssemblyProduct("SQLiteHelper")]
  [assembly: AssemblyCopyright("")]
  [assembly: AssemblyTrademark("")]
  [assembly: AssemblyCulture("")]
  [assembly: ComVisible(false)]
  [assembly: Guid("f6a8f27a-a98f-4743-a666-7df67b3acbc0")]
  [assembly: AssemblyVersion("1.0.0.0")]
  [assembly: AssemblyFileVersion("1.0.0.0")]
  1. 创建SQLiteHelper类
    为实现C#基于SQLiteHelper类实现存取Sqlite数据库的方法,我们需要新建类SQLiteHelper,来实现SQLite ADO.NET的数据库操作。SQLiteHelper类需要与SQLiteHelper.cs的不同8个方面有所变化,分别是:

·数据库路径不再写死而是动态传入;
·多个线程安全问题,在每个执行线程中都需要独立运行,所以需要每个连接都开一个对象来访问,否则会出现链接不断开的问题;
·增加函数QueryValueSql返回查询结果第一行第一列的值;
·增加函数QueryDataTableSql返回查询结果的DataTable对象;
·增加函数QueryDataSetSql返回查询结果的DataTable对象;
·增加函数UpdateDataTableSql,通过传入DataTable对象进行更新;
·增加函数UpdateDataSetSql,通过传入DataSet对象进行更新;
·修正了SQLiteCommand对象没有释放引起的Application锁死;
·增加SQL注入防范。

修改后的SQLiteHelper核心代码如下:

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

namespace SQLiteHelper
{
    public class SQLiteHelper
    {
        string dbPath;

        public SQLiteHelper(string dbPath)
        {
            this.dbPath = dbPath;
        }

        private int ExecuteNonQuery(SqlCommand cmd)
        {
            using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbPath + ";")){
                cmd.Connection = conn;
                conn.Open();
                int result = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return result;
            }
        }

        private object ExecuteScalar(SqlCommand cmd)
        {
            using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbPath + ";")){
                cmd.Connection = conn;
                conn.Open();
                object obj = cmd.ExecuteScalar();
                cmd.Parameters.Clear();
                return obj;
            }
        }

        public int ExecuteNonQuerySql(string sql, params SqlParameter[] parameters)
        {
            using (SQLiteCommand cmd = new SQLiteCommand(sql)){
                if (parameters != null)
                    cmd.Parameters.AddRange(parameters);
                return ExecuteNonQuery(cmd);
            }
        }

        public object ExecuteScalarSql(string sql, params SqlParameter[] parameters)
        {
            using (SQLiteCommand cmd = new SQLiteCommand(sql)){
                if (parameters != null)
                    cmd.Parameters.AddRange(parameters);
                return ExecuteScalar(cmd);
            }
        }

        public DataTable QueryDataTableSql(string sql, params SqlParameter[] parameters)
        {
            using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbPath + ";")){
                SQLiteDataAdapter adapter = new SQLiteDataAdapter(sql, conn);
                if (parameters != null)
                    adapter.SelectCommand.Parameters.AddRange(parameters);
                DataTable table = new DataTable();
                adapter.Fill(table);
                return table;
            }
        }

        public DataSet QueryDataSetSql(string sql, params SqlParameter[] parameters)
        {
            using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbPath + ";")){
                SQLiteDataAdapter adapter = new SQLiteDataAdapter(sql, conn);
                if (parameters != null)
                    adapter.SelectCommand.Parameters.AddRange(parameters);
                DataSet ds = new DataSet();
                adapter.Fill(ds);
                return ds;
            }
        }

        public object QueryValueSql(string sql, params SqlParameter[] parameters)
        {
            using (SQLiteCommand cmd = new SQLiteCommand(sql)){
                if (parameters != null)
                    cmd.Parameters.AddRange(parameters);
                return ExecuteScalar(cmd);
            }
        }

        public int UpdateDataTableSql(DataTable table, string tableName)
        {
            string sql = string.Format("select top 0 * from {0}", tableName);
            using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbPath + ";"))
            {
                SQLiteDataAdapter adapter = new SQLiteDataAdapter(sql, conn);
                SQLiteCommandBuilder cmdBuilder = new SQLiteCommandBuilder(adapter);
                adapter.UpdateCommand = cmdBuilder.GetUpdateCommand();
                adapter.InsertCommand = cmdBuilder.GetInsertCommand();
                adapter.DeleteCommand = cmdBuilder.GetDeleteCommand();
                return adapter.Update(table);
            }
        }

        public int UpdateDataSetSql(DataSet ds, string tableName)
        {
            string sql = string.Format("select top 0 * from {0}", tableName);
            using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbPath + ";"))
            {
                SQLiteDataAdapter adapter = new SQLiteDataAdapter(sql, conn);
                SQLiteCommandBuilder cmdBuilder = new SQLiteCommandBuilder(adapter);
                adapter.UpdateCommand = cmdBuilder.GetUpdateCommand();
                adapter.InsertCommand = cmdBuilder.GetInsertCommand();
                adapter.DeleteCommand = cmdBuilder.GetDeleteCommand();
                return adapter.Update(ds);
            }
        }
    }
}
  1. 调用SQLiteHelper类
    调用SQLiteHelper类需要其他程序集引用此类。程序中创建SQLiteHelper实例后,调用SQLiteHelper提供的方法实现SQLite的数据操作。
public partial class Form1 : Form
{
    SQLiteHelper.SQLiteHelper sqliteHelper;

    public Form1()
    {
        InitializeComponent();
        string dbPath = @"D:\test.db";
        sqliteHelper = new SQLiteHelper.SQLiteHelper(dbPath);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string sql = "select * from tb_user";
        DataTable dt = sqliteHelper.QueryDataTableSql(sql, null);
        dataGridView1.DataSource = dt;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        string sql = "insert into tb_user(id,name,age) values (@id,@name,@age)";
        SQLiteParameter[] parameters = new SQLiteParameter[]{
            new SQLiteParameter("@id","20180316001"),
            new SQLiteParameter("@name","Lucy"),
            new SQLiteParameter("@age",21)
        };
        int result = sqliteHelper.ExecuteNonQuerySql(sql, parameters);
        if (result > 0)
        {
            MessageBox.Show("添加成功!");
        }
        else
        {
            MessageBox.Show("添加失败!");
        }
    }
}

三、示例说明
我们在项目中使用SQLite数据库时,只需引用SQLiteHelper类库,以及在需要操作SQLite数据库的类中创建SQLiteHelper对象,即可调用SQLiteHelper的方法,轻松实现数据的操作。下面给出两个示例。

  1. 查询表数据并显示在DataGridView中。
private void button1_Click(object sender, EventArgs e)
{
    string dbPath = @"D:\test.db";
    SQLiteHelper.SQLiteHelper sqliteHelper = new SQLiteHelper.SQLiteHelper(dbPath);
    string sql = "select * from tb_user";
    DataTable dt = sqliteHelper.QueryDataTableSql(sql, null);
    dataGridView1.DataSource = dt;
}
  1. 插入记录至表中并给出提示信息。
private void button2_Click(object sender, EventArgs e)
{
    string dbPath = @"D:\test.db";
    SQLiteHelper.SQLiteHelper sqliteHelper = new SQLiteHelper.SQLiteHelper(dbPath);
    string sql = "insert into tb_user(id,name,age) values (@id,@name,@age)";
    SQLiteParameter[] parameters = new SQLiteParameter[]{
        new SQLiteParameter("@id","20180316001"),
        new SQLiteParameter("@name","Lucy"),
        new SQLiteParameter("@age",21)
    };
    int result = sqliteHelper.ExecuteNonQuerySql(sql, parameters);
    if (result > 0)
    {
        MessageBox.Show("添加成功!");
    }
    else
    {
        MessageBox.Show("添加失败!");
    }
}

以上两个示例中,我们都是在SQLiteHelper.SQLiteHelper类构造函数中传入了数据库文件的路径,将SQLiteHelper对象实例化后,就能轻松地对数据库进行操作。其中,示例一是查询表数据,示例二是插入记录操作。按需调用SQLiteHelper提供的其他方法即可完成相应的数据操作工作。

四、总结
通过我们的实践,我们发现,使用SQLiteHelper类库实现对SQLite数据库的操作十分便捷,是一个很好的SQLite数据库操作类库。通过SQLiteHelper的封装,我们能够很方便地实现对SQLite数据库的增、删、改、查等常规操作。此外,SQLiteHelper还支持Linq to sqlite语法,让我们更加轻松地处理数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • Asp.net core实现PushStream视频流推送

    Asp.net core实现PushStream视频流推送攻略 在Asp.net core中,可以使用PushStream技术来实现视频流推送。本攻略将提供详细的步骤和示例说明,演示如何在Asp.net core中实现PushStream视频流推送。 步骤 步骤1:创建一个新的Asp.net core Web应用程序 首先,需要创建一个新的Asp.net c…

    C# 2023年5月17日
    00
  • C#判断字符是否为汉字的三种方法分享

    下面我会详细讲解“C#判断字符是否为汉字的三种方法分享”的完整攻略。 1.方法一:使用Unicode编码范围判断 汉字在Unicode编码中的范围是4E00~9FA5,因此可以使用Unicode编码范围来判断字符是否为汉字。 下面是示例代码: public bool IsChineseByRange(char c) { return (c >= 0x4…

    C# 2023年6月8日
    00
  • C#中DataSet转化为实体集合类的方法

    将C#中的DataSet转化为实体集合类的方法涉及到数据集合类和实体类之间的转换。下面是实现这个过程的攻略: 步骤一:创建实体类 首先,我们需要创建实体类。这个类必须符合我们数据库中表的结构。一个简单的实体类示例如下: public class User { public int Id { get; set; } public string Name { g…

    C# 2023年6月3日
    00
  • 解析使用enumerator模式简化异步操作的详解

    我很乐意为您讲解“解析使用enumerator模式简化异步操作的详解”的攻略。 什么是enumerator模式? enumerator是一个可以使多个异步操作变得更加简单和易于管理的模式,也被称为协程模式。Enumerator是一个实现IEnumerator接口的类,它包含了一个异步操作,当这个异步操作完成时,它会返回一个结果。使用enumerator模式可…

    C# 2023年6月6日
    00
  • C#实现控制线程池最大数并发线程

    在C#中,线程池是一种用于管理线程的机制,可以帮助我们更好地管理应用程序中的线程。在某些情况下,我们需要控制线程池中的最大并发线程数,以避免过多的线程竞争资源,导致性能下降。本文将详细讲解如何使用C#实现控制线程池最大数并发线程,并提供两个示例。 1. 使用ThreadPool.SetMaxThreads方法控制线程池最大并发线程数 C#中的ThreadPo…

    C# 2023年5月15日
    00
  • Unity3D在Preview中打印日志的方法

    Unity3D在Preview中打印日志的方法可以使用以下两种方式: 1. 使用Debug类中的方法 Debug类是Unity3D中最常用的用于打印日志的类之一。以下是在Preview中使用Debug类打印日志的步骤: 步骤1:在Unity3D编辑器中打开你的脚本文件 通常,你需要将这个脚本附加到一个游戏对象上,并且可以通过单击左上角的Play按钮在Edit…

    C# 2023年6月3日
    00
  • VB.net读取Word文档属性的方法

    下面是VB.net读取Word文档属性的方法的完整攻略: 一、需求背景 在处理Word文档时,我们可能会需要读取文档的一些属性,比如文档名称、创建时间、最后修改时间等信息。那么,如何在VB.net中获取这些属性呢?接下来,我们将一步一步展开详细讲解。 二、获取Word文档属性的方法 在VB.net中,获取Word文档属性有多种方法,这里我们介绍其中两种: 1…

    C# 2023年5月31日
    00
  • C#中的正则表达式介绍

    C#中的正则表达式介绍 简介 正则表达式(RegularExpression)是一种用特殊符号和文本模式来描述字符串特征的表达式。正则表达式在程序中常用来匹配、查找及替换字符串中的某些部分。 正则表达式的基本语法 字符串匹配 在正则表达式中,使用普通字符匹配普通的字符串,例如:hello world被正则表达式hello world匹配。此外想匹配多个字符时…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部