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日

相关文章

  • 常用C#正则表达式汇总介绍

    让我来为您详细讲解“常用C#正则表达式汇总介绍”的完整攻略。 常用C#正则表达式汇总介绍 正则表达式是一种描述字符串规律的方法,可以用来在字符串中查找或替换特定的内容。C#中内置了正则表达式引擎,可以快速地完成字符串的操作。以下是常用的几个正则表达式,以及它们的示例。 匹配数字 如果要匹配一个或多个数字,可以使用 \d。例如,要匹配字符串 “hello123…

    C# 2023年5月15日
    00
  • asp.net 备份和恢复数据库的方法示例

    当我们在开发ASP.NET项目的时候,经常需要用到对数据库的备份和恢复。本文将详细介绍如何使用SQL Server Management Studio(SSMS)和Transact-SQL(T-SQL)备份和恢复数据库,以及在ASP.NET中使用C#代码备份和恢复数据库。 使用SQL Server Management Studio(SSMS)备份和恢复数据…

    C# 2023年5月31日
    00
  • C#中读取App.config配置文件代码实例

    下面就给您详细讲解一下在C#中读取App.config配置文件的完整攻略。 什么是App.config? 在C#项目中,App.config是存放配置信息的文件,经常用来保存应用程序的配置信息,比如数据库连接字符串、路径等等。在项目中对于一些数据的统一管理是非常有用的,修改方便,且使用配置文件时只需要修改App.config即可不用修改代码。 读取App.c…

    C# 2023年6月1日
    00
  • C#简单生成随机密码的方法示例

    下面我来为您详细讲解“C#简单生成随机密码的方法示例”的完整攻略。 1. 生成随机密码 生成随机密码的方法比较多,可以通过随机函数生成随机字符序列,也可以从字符集中随机选取字符生成密码。下面我将介绍几种方法。 1.1 使用 Random 类 可以使用 Random 类生成随机数,然后将生成的随机数转为希望的字符序列(如数字、字母和特殊字符),从而组成随机密码…

    C# 2023年6月7日
    00
  • C#微信公众号与订阅号接口开发示例代码

    下面我将详细讲解如何进行C#微信公众号与订阅号接口开发,并提供以下两个示例说明: 示例一:获取微信公众号基本信息 步骤一:申请开发者账号 首先,你需要到微信公众平台官网上注册一个开发者账号。 步骤二:创建公众号 在申请开发者账号后,你需要创建一个新的公众号。 步骤三:获取AppID和AppSecret 创建公众号后,在公众号设置页面可以获取到AppID和Ap…

    C# 2023年5月31日
    00
  • .Net 自定义转换器JsonConverter的使用详解

    什么是JsonConverter JsonConverter是.Net框架中提供的一种用于序列化和反序列化Json格式数据的类库,它可以通过自定义转换器来灵活地完成对象和Json之间的转换。 如何使用JsonConverter 2.1 引用命名空间 为了使用JsonConverter类库,我们需要在代码中引入Newtonsoft.Json命名空间。 usin…

    C# 2023年6月3日
    00
  • C#与C++与互操作实例讲解

    C#与C++互操作实例讲解 什么是互操作? 在计算机科学领域,互操作意味着在不同编程语言或计算机系统之间交流和交换信息的能力。在本文中,我们将重点介绍如何使用C#和C++进行互操作。 为什么使用互操作? 尽管C#具有很高的开发速度和开发效率,但在一些实时应用程序或者特定场景下,使用C++能够提供更好的性能和一些功能。通过在C#和C++之间实现互操作,我们可以…

    C# 2023年5月14日
    00
  • C#使用百度Ueditor富文本框实现上传文件

    下面是“C#使用百度Ueditor富文本框实现上传文件”的完整攻略。 准备工作 安装百度Ueditor在NuGet中检索百度ueditor.net.Mvc或者使用百度Ueditor官网提供的下载方式,将ueditor的dll放入Solution下面的bin目录下。 配置Ueditor (1)在网站的Web.config文件中,加入如下内容。 <syst…

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