C#如何操作SQLite实现数据的增删改查
发表于:2025-02-07 作者:千家信息网编辑
千家信息网最后更新 2025年02月07日,这篇文章主要介绍了C#如何操作SQLite实现数据的增删改查,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。简介SQLite是一个轻量级
千家信息网最后更新 2025年02月07日C#如何操作SQLite实现数据的增删改查
这篇文章主要介绍了C#如何操作SQLite实现数据的增删改查,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
简介
SQLite是一个轻量级、跨平台的关系型数据库,在小型项目中,方便,易用,同时支持多种开发语言,下面是我用C#语言对SQLite 的一个封装。
Winfrom界面如下:
代码还需要改进部分:
下面的代码我不觉得是完美的,读者可以自己去实现这些功能:
1.如果不想用多线程可以去掉UsingLock.cs ,在SQLiteHelper.cs中删除对应的引用即可。
2.创建数据库文件,可以从代码中分离成单独的方法。比如创建有密码的数据库文件。
3.在执行SQL语句时,有些语句执行成功,也不会有影响行数。比如,创建表,删除表,此时执行SQL语句返回的影响行数就为0。
4.只要SQL语句不报错就是执行成功的,在方法的返回值可以改为多个,比如用
Tuple
同样,也可以这样:
Tuple
主要代码
SQLiteHelper.cs
using System;using System.Collections.Generic;using System.Data;using System.Data.Common;using System.Data.SQLite;using System.IO;using System.Text; namespace MySQLiteHelper{ public class SQLiteHelper { #region 字段 ////// 事务的基类 /// private DbTransaction DBtrans; ////// 使用静态变量字典解决多线程实例本类,实现一个数据库对应一个clslock /// private static readonly DictionaryRWL = new Dictionary (); /// /// 数据库地址 /// private readonly string mdataFile; ////// 数据库密码 /// private readonly string mPassWord; private readonly string LockName = null; ////// 数据库连接定义 /// private SQLiteConnection mConn; #endregion #region 构造函数 ////// 根据数据库地址初始化 /// /// 数据库地址 public SQLiteHelper(string dataFile) { this.mdataFile = dataFile ?? throw new ArgumentNullException("dataFile=null"); //this.mdataFile = AppDomain.CurrentDomain.BaseDirectory + dataFile; this.mdataFile = dataFile; if (!RWL.ContainsKey(dataFile)) { LockName = dataFile; RWL.Add(dataFile, new ClsLock()); } } ////// 使用密码打开数据库 /// /// 数据库地址 /// 数据库密码 public SQLiteHelper(string dataFile, string PassWord) { this.mdataFile = dataFile ?? throw new ArgumentNullException("dataFile is null"); this.mPassWord = PassWord ?? throw new ArgumentNullException("PassWord is null"); //this.mdataFile = AppDomain.CurrentDomain.BaseDirectory + dataFile; this.mdataFile = dataFile; if (!RWL.ContainsKey(dataFile)) { LockName = dataFile; RWL.Add(dataFile, new ClsLock()); } } #endregion #region 打开/关闭 数据库 ////// 打开 SQLiteManager 使用的数据库连接 /// public void Open() { if (string.IsNullOrWhiteSpace(mPassWord)) { mConn = OpenConnection(this.mdataFile); } else { mConn = OpenConnection(this.mdataFile, mPassWord); } Console.WriteLine("打开数据库成功"); } ////// 关闭连接 /// public void Close() { if (this.mConn != null) { try { this.mConn.Close(); if (RWL.ContainsKey(LockName)) { RWL.Remove(LockName); } } catch { Console.WriteLine("关闭失败"); } } Console.WriteLine("关闭数据库成功"); } #endregion #region 事务 ////// 开始事务 /// public void BeginTrain() { EnsureConnection(); DBtrans = mConn.BeginTransaction(); } ////// 提交事务 /// public void DBCommit() { try { DBtrans.Commit(); } catch (Exception) { DBtrans.Rollback(); } } #endregion #region 工具 ////// 打开一个SQLite数据库文件,如果文件不存在,则创建(无密码) /// /// ///SQLiteConnection 类 private SQLiteConnection OpenConnection(string dataFile) { if (dataFile == null) { throw new ArgumentNullException("dataFiledataFile=null"); } if (!File.Exists(dataFile)) { SQLiteConnection.CreateFile(dataFile); } SQLiteConnection conn = new SQLiteConnection(); SQLiteConnectionStringBuilder conStr = new SQLiteConnectionStringBuilder { DataSource = dataFile }; conn.ConnectionString = conStr.ToString(); conn.Open(); return conn; } ////// 打开一个SQLite数据库文件,如果文件不存在,则创建(有密码) /// /// /// ///SQLiteConnection 类 private SQLiteConnection OpenConnection(string dataFile, string Password) { if (dataFile == null) { throw new ArgumentNullException("dataFile=null"); } if (!File.Exists(Convert.ToString(dataFile))) { SQLiteConnection.CreateFile(dataFile); } try { SQLiteConnection conn = new SQLiteConnection(); SQLiteConnectionStringBuilder conStr = new SQLiteConnectionStringBuilder { DataSource = dataFile, Password = Password }; conn.ConnectionString = conStr.ToString(); conn.Open(); return conn; } catch (Exception) { return null; } } ////// 读取 或 设置 SQLiteManager 使用的数据库连接 /// public SQLiteConnection Connection { get { return mConn; } private set { mConn = value ?? throw new ArgumentNullException(); } } ////// 确保数据库是连接状态 /// ///protected void EnsureConnection() { if (this.mConn == null) { throw new Exception("SQLiteManager.Connection=null"); } if (mConn.State != ConnectionState.Open) { mConn.Open(); } } /// /// 获取数据库文件的路径 /// ///public string GetDataFile() { return this.mdataFile; } /// /// 判断表 table 是否存在 /// /// ///存在返回true,否则返回false public bool TableExists(string table) { if (table == null) { throw new ArgumentNullException("table=null"); } EnsureConnection(); SQLiteDataReader reader = ExecuteReader("SELECT count(*) as c FROM sqlite_master WHERE type='table' AND name=@tableName ", new SQLiteParameter[] { new SQLiteParameter("tableName", table) }); if (reader == null) { return false; } reader.Read(); int c = reader.GetInt32(0); reader.Close(); reader.Dispose(); //return false; return c == 1; } ////// VACUUM 命令(通过复制主数据库中的内容到一个临时数据库文件,然后清空主数据库,并从副本中重新载入原始的数据库文件) /// ///public bool Vacuum() { try { using (SQLiteCommand Command = new SQLiteCommand("VACUUM", Connection)) { Command.ExecuteNonQuery(); } return true; } catch (System.Data.SQLite.SQLiteException) { return false; } } #endregion #region 执行SQL /// /// 执行SQL, 并返回 SQLiteDataReader 对象结果 /// /// /// null 表示无参数 ///public SQLiteDataReader ExecuteReader(string sql, SQLiteParameter[] paramArr) { if (sql == null) { throw new ArgumentNullException("sql=null"); } EnsureConnection(); using (RWL[LockName].Read()) { using (SQLiteCommand cmd = new SQLiteCommand(sql, Connection)) { if (paramArr != null) { cmd.Parameters.AddRange(paramArr); } try { SQLiteDataReader reader = cmd.ExecuteReader(); cmd.Parameters.Clear(); return reader; } catch (Exception) { return null; } } } } /// /// 执行查询,并返回dataset对象 /// /// SQL查询语句 /// 参数数组 ///public DataSet ExecuteDataSet(string sql, SQLiteParameter[] paramArr) { if (sql == null) { throw new ArgumentNullException("sql=null"); } this.EnsureConnection(); using (RWL[LockName].Read()) { using (SQLiteCommand cmd = new SQLiteCommand(sql, this.Connection)) { if (paramArr != null) { cmd.Parameters.AddRange(paramArr); } try { SQLiteDataAdapter da = new SQLiteDataAdapter(); DataSet ds = new DataSet(); da.SelectCommand = cmd; da.Fill(ds); cmd.Parameters.Clear(); da.Dispose(); return ds; } catch (Exception) { return null; } } } } /// /// 执行SQL查询,并返回dataset对象。 /// /// 映射源表的名称 /// SQL语句 /// SQL参数数组 ///public DataSet ExecuteDataSet(string strTable, string sql, SQLiteParameter[] paramArr) { if (sql == null) { throw new ArgumentNullException("sql=null"); } this.EnsureConnection(); using (RWL[LockName].Read()) { using (SQLiteCommand cmd = new SQLiteCommand(sql, this.Connection)) { if (paramArr != null) { cmd.Parameters.AddRange(paramArr); } try { SQLiteDataAdapter da = new SQLiteDataAdapter(); DataSet ds = new DataSet(); da.SelectCommand = cmd; da.Fill(ds, strTable); cmd.Parameters.Clear(); da.Dispose(); return ds; } catch (Exception) { return null; } } } } /// /// 执行SQL,返回受影响的行数,可用于执行表创建语句,paramArr == null 表示无参数 /// /// ///public int ExecuteNonQuery(string sql, SQLiteParameter[] paramArr) { if (sql == null) { throw new ArgumentNullException("sql=null"); } this.EnsureConnection(); using (RWL[LockName].Read()) { try { using (SQLiteCommand cmd = new SQLiteCommand(sql, Connection)) { if (paramArr != null) { foreach (SQLiteParameter p in paramArr) { cmd.Parameters.Add(p); } } int c = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); return c; } } catch (SQLiteException) { return 0; } } } /// /// 执行SQL,返回结果集第一行,如果结果集为空,那么返回空 List(List.Count=0), /// rowWrapper = null 时,使用 WrapRowToDictionary /// /// /// ///public object ExecuteScalar(string sql, SQLiteParameter[] paramArr) { if (sql == null) { throw new ArgumentNullException("sql=null"); } this.EnsureConnection(); using (RWL[LockName].Read()) { using (SQLiteCommand cmd = new SQLiteCommand(sql, Connection)) { if (paramArr != null) { cmd.Parameters.AddRange(paramArr); } try { object reader = cmd.ExecuteScalar(); cmd.Parameters.Clear(); cmd.Dispose(); return reader; } catch (Exception) { return null; } } } } /// /// 查询一行记录,无结果时返回 null,conditionCol = null 时将忽略条件,直接执行 select * from table /// /// 表名 /// /// ///public 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; } object result = ExecuteScalar(sql, new SQLiteParameter[] { new SQLiteParameter(conditionCol, conditionVal) }); return result; } #endregion #region 增 删 改 /// /// 执行 insert into 语句 /// /// /// ///public int InsertData(string table, Dictionary entity) { if (table == null) { throw new ArgumentNullException("table=null"); } this.EnsureConnection(); string sql = BuildInsert(table, entity); return this.ExecuteNonQuery(sql, BuildParamArray(entity)); } /// /// 执行 update 语句,注意:如果 where = null,那么 whereParams 也为 null, /// /// 表名 /// 要修改的列名和列名的值 /// 查找符合条件的列 /// where条件中参数的值 ///public int Update(string table, Dictionary entity, string where, SQLiteParameter[] whereParams) { if (table == null) { throw new ArgumentNullException("table=null"); } this.EnsureConnection(); string sql = BuildUpdate(table, entity); SQLiteParameter[] parameter = BuildParamArray(entity); if (where != null) { sql += " where " + where; if (whereParams != null) { SQLiteParameter[] newArr = new SQLiteParameter[(parameter.Length + whereParams.Length)]; Array.Copy(parameter, newArr, parameter.Length); Array.Copy(whereParams, 0, newArr, parameter.Length, whereParams.Length); parameter = newArr; } } return this.ExecuteNonQuery(sql, parameter); } /// /// 执行 delete from table 语句,where不必包含'where'关键字,where = null 时将忽略 whereParams /// /// /// /// ///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 ExecuteNonQuery(sql, whereParams); } /// /// 将 Dictionary 类型数据 转换为 SQLiteParameter[] 类型 /// /// ///private SQLiteParameter[] BuildParamArray(Dictionary entity) { List list = new List (); foreach (string key in entity.Keys) { list.Add(new SQLiteParameter(key, entity[key])); } if (list.Count == 0) { return null; } return list.ToArray(); } /// /// 将 Dictionary 类型数据 转换为 插入数据 的 SQL语句 /// /// 表名 /// 字典 ///private string BuildInsert(string table, Dictionary 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(); } /// /// 将 Dictionary 类型数据 转换为 修改数据 的 SQL语句 /// /// 表名 /// 字典 ///private string BuildUpdate(string table, Dictionary 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(); } #endregion }}
UsingLock.cs
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Threading; namespace MySQLiteHelper{ ////// 使用using代替lock操作的对象,可指定写入和读取锁定模式 /// public sealed class ClsLock { #region 内部类 ////// 利用IDisposable的using语法糖方便的释放锁定操作内部类 /// private struct Lock : IDisposable { ////// 读写锁对象 /// private readonly ReaderWriterLockSlim _Lock; ////// 是否为写入模式 /// private bool _IsWrite; ////// 利用IDisposable的using语法糖方便的释放锁定操作构造函数 /// /// 读写锁 /// 写入模式为true,读取模式为false public Lock(ReaderWriterLockSlim rwl, bool isWrite) { _Lock = rwl; _IsWrite = isWrite; } ////// 释放对象时退出指定锁定模式 /// public void Dispose() { if (_IsWrite) { if (_Lock.IsWriteLockHeld) { _Lock.ExitWriteLock(); } } else { if (_Lock.IsReadLockHeld) { _Lock.ExitReadLock(); } } } } ////// 空的可释放对象,免去了调用时需要判断是否为null的问题内部类 /// private class Disposable : IDisposable { ////// 空的可释放对象 /// public static readonly Disposable Empty = new Disposable(); ////// 空的释放方法 /// public void Dispose() { } } #endregion ////// 读写锁 /// private readonly ReaderWriterLockSlim _LockSlim = new ReaderWriterLockSlim(); ////// 使用using代替lock操作的对象,可指定写入和读取锁定模式构造函数 /// public ClsLock() { Enabled = true; } ////// 是否启用,当该值为false时,Read()和Write()方法将返回 Disposable.Empty /// public bool Enabled { get; set; } ////// 进入读取锁定模式,该模式下允许多个读操作同时进行, /// 退出读锁请将返回对象释放,建议使用using语块, /// Enabled为false时,返回Disposable.Empty, /// 在读取或写入锁定模式下重复执行,返回Disposable.Empty; /// public IDisposable Read() { if (Enabled == false || _LockSlim.IsReadLockHeld || _LockSlim.IsWriteLockHeld) { return Disposable.Empty; } else { _LockSlim.EnterReadLock(); return new Lock(_LockSlim, false); } } ////// 进入写入锁定模式,该模式下只允许同时执行一个读操作, /// 退出读锁请将返回对象释放,建议使用using语块, /// Enabled为false时,返回Disposable.Empty, /// 在写入锁定模式下重复执行,返回Disposable.Empty /// ///读取模式下不能进入写入锁定状态 public IDisposable Write() { if (Enabled == false || _LockSlim.IsWriteLockHeld) { return Disposable.Empty; } else if (_LockSlim.IsReadLockHeld) { throw new NotImplementedException("读取模式下不能进入写入锁定状态"); } else { _LockSlim.EnterWriteLock(); return new Lock(_LockSlim, true); } } } }
Form1.cs
using MySQLiteHelper;using System;using System.Collections.Generic;using System.Data;using System.Data.SQLite;using System.Windows.Forms; namespace SQLiteDemo{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private SQLiteHelper SQLiteHelpers = null; private const string DBAddress = "D:\\SQLiteData\\test_record.db3"; private void Form1_Load(object sender, EventArgs e) { SQLiteHelpers = new SQLiteHelper(DBAddress,"123456"); } ////// 打开数据库 /// /// /// private void Button_OpenDB_Click(object sender, EventArgs e) { SQLiteHelpers.Open(); Label_DBOpenState.Text = "打开"; } ////// 关闭数据库 /// /// /// private void Button_CloseDB_Click(object sender, EventArgs e) { SQLiteHelpers.Close(); Label_DBOpenState.Text = "关闭"; } ////// 查询 /// /// /// private void Button_Query_Click(object sender, EventArgs e) { SQLiteParameter[] parameter = new SQLiteParameter[] { new SQLiteParameter("address", "济南") }; string sql = "SELECT * FROM student WHERE address = @address"; DataSet dataSet = SQLiteHelpers.ExecuteDataSet(sql, parameter); if (dataSet != null) { dataGridView1.DataSource = dataSet.Tables[0]; } } ////// 插入数据 /// /// /// private void Button_Add_Click(object sender, EventArgs e) { Dictionarydic = new Dictionary (); dic.Add("ID", 6); dic.Add("name", "王二麻子"); dic.Add("age", 44); dic.Add("address", "陕西"); int result = SQLiteHelpers.InsertData("student", dic); Console.WriteLine("插入结果,受影响的行数:" + result); } /// /// 修改数据 /// /// /// private void Button_Modify_Click(object sender, EventArgs e) { Dictionarydic = new Dictionary (); //将列名 name 的值改为 "猴子" dic.Add("name", "猴子"); //将列名 address 的值改为 花果山 dic.Add("address", "花果山"); //where条件 string where = "ID = @ID AND age = @Age"; //where条件中对应的参数 SQLiteParameter[] parameter = new SQLiteParameter[] { new SQLiteParameter("ID", 4), new SQLiteParameter("Age",23) }; int result = SQLiteHelpers.Update("student", dic, where, parameter); Console.WriteLine("修改结果,受影响的行数:" + result); } /// /// 删除数据 /// /// /// private void Button_Delete_Click(object sender, EventArgs e) { //where条件 string where = "ID = @ID"; //where条件中对应的参数 SQLiteParameter[] parameter = new SQLiteParameter[] { new SQLiteParameter("ID", 6), }; int result = SQLiteHelpers.Delete("student", where, parameter); Console.WriteLine("删除结果,受影响的行数:" + result); } ////// 判断表是否存在 /// /// /// private void Button_TableExists_Click(object sender, EventArgs e) { string title = "dddd"; bool result = SQLiteHelpers.TableExists(title); Console.WriteLine(string.Format("{0} 表是否存在,结果:{1}", title, result)); } //输出各表中的数据 //public static void PrintValues(DataSet ds) //{ // foreach (DataTable table in ds.Tables) // { // Console.WriteLine("表名称:" + table.TableName); // foreach (DataRow row in table.Rows) // { // foreach (DataColumn column in table.Columns) // { // Console.Write(row[column] + ""); // } // Console.WriteLine(); // } // } //} }}
感谢你能够认真阅读完这篇文章,希望小编分享的"C#如何操作SQLite实现数据的增删改查"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
数据
数据库
参数
模式
语句
对象
结果
文件
条件
影响
代表
密码
查询
成功
事务
代码
同时
地址
方法
篇文章
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
联想服务器售后成都
安卓手机数据库怎么创建
emule 连不上服务器
软件开发是属于工业企业吗
sql语句提取多表数据库
陕西之路网络技术
网络安全发言稿320
数据库 事务 作用
8口kvm连接两台服务器
提醒网络安全短信
pc蛋蛋软件开发定制
江苏创新网络技术创新服务
matlab读取数据库
广州软件园软件开发公司招工吗
佛山卫星软件开发批发价
计算机网络技术题
mysql8数据库安装
怀旧服怎么查以前的服务器
数据库怎么删除指定文件组
江苏新一代软件开发过程服务标准
网络安全苗头
网络安全是什么的安全
黄浦区银联数据库服务商服务费
服务器更换数据库
修改数据库实时汇总
山西服务器机柜定做
seer 数据库是什么
戴尔r790xd服务器
线下美容院软件开发公司
网络技术面试题目