C# SQLite库使用技巧
作者:程序猿evint 发布时间:2023-10-27 19:05:21
1、SQLite介绍
SQLite,是一款轻型的数据库,是遵守的ACID关系型数据库管理系统,它包含在一个相对小的C库中。它的设计目标嵌入式是的,而且已经在很多中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等。
SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine.
SQLite是一个开源、免费的小型RDBMS(关系型数据库),能独立运行、无服务器、零配置、支持事物,用C实现,内存占用较小,支持绝大数的SQL92标准。
SQLite数据库官方主页:http://www.sqlite.org/index.html
2、C#下调用SQLite数据库
在NuGet程序包内,搜索System.Data.Sqlite,安装Sqlite类库
3、在C#程序内添加SqliteHelper
sqliteHelper中主要用到2个方法:
a、ExecuteNonQuery 执行Insert,Update、Delete、创建库等操作,返回值是数据库影响的行数
b、ExecuteDataSet执行Select操作,返回查询数据集
public class SQLiteHelper
{
public static string ConnectionString = "Data Source =" + Environment.CurrentDirectory + @"\database.db" + ";Pooling = true; FailIfMissing = true";
/// <summary>
/// 执行数据库操作(新增、更新或删除)
/// </summary>
/// <param name="cmdstr">连接字符串</param>
/// <param name="cmdParms">SqlCommand对象</param>
/// <returns>受影响的行数</returns>
public int ExecuteNonQuery(string cmdstr, params SQLiteParameter[] cmdParms)
{
int result = 0;
using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
{
SQLiteTransaction trans = null;
SQLiteCommand cmd = new SQLiteCommand(cmdstr);
PrepareCommand(cmd, conn, ref trans, true, cmd.CommandType, cmd.CommandText, cmdParms);
try
{
result = cmd.ExecuteNonQuery();
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
throw ex;
}
}
return result;
}
/// <summary>
/// 预处理Command对象,数据库链接,事务,需要执行的对象,参数等的初始化
/// </summary>
/// <param name="cmd">Command对象</param>
/// <param name="conn">Connection对象</param>
/// <param name="trans">Transcation对象</param>
/// <param name="useTrans">是否使用事务</param>
/// <param name="cmdType">SQL字符串执行类型</param>
/// <param name="cmdText">SQL Text</param>
/// <param name="cmdParms">SQLiteParameters to use in the command</param>
private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, ref SQLiteTransaction trans, bool useTrans, CommandType cmdType, string cmdText, params SQLiteParameter[] cmdParms)
{
try
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
if (useTrans)
{
trans = conn.BeginTransaction(IsolationLevel.ReadCommitted);
cmd.Transaction = trans;
}
cmd.CommandType = cmdType;
if (cmdParms != null)
{
foreach (SQLiteParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}
catch
{
}
}
/// <summary>
/// 数据库查询
/// </summary>
/// <param name="cmdstr">sql语句</param>
/// <param name="tableName">表名</param>
/// <returns>DataSet对象</returns>
public DataSet ExecuteDataSet(string cmdstr)
{
DataSet ds = new DataSet();
SQLiteConnection conn = new SQLiteConnection(ConnectionString);
SQLiteTransaction trans = null;
SQLiteCommand cmd = new SQLiteCommand(cmdstr);
PrepareCommand(cmd, conn, ref trans, false, cmd.CommandType, cmd.CommandText);
try
{
SQLiteDataAdapter sda = new SQLiteDataAdapter(cmd);
sda.Fill(ds);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (cmd.Connection != null)
{
if (cmd.Connection.State == ConnectionState.Open)
{
cmd.Connection.Close();
}
}
}
return ds;
}
4、Sqlite部分技巧
a、SQLiteConnection类的CreateFile方法,在程序内动态创建数据库文件,通过下面的方法即可创建出Analysis.db名称的数据库
/// <summary>
/// 数据库路径
/// </summary>
private static string databasepath = AppDomain.CurrentDomain.BaseDirectory + "DataBase\\";
/// <summary>
/// 数据库名称
/// </summary>
private const string databasename = "Analysis.db";
/// <summary>
/// 创建数据库
/// </summary>
public static void CreateDataBase()
{
try
{
if (!File.Exists(databasepath + databasename))
{
if (!Directory.Exists(databasepath))
Directory.CreateDirectory(databasepath);
SQLiteConnection.CreateFile(databasepath + databasename);
LogHelper.Info("创建数据库:" + databasename + "成功!");
}
}
catch (Exception ex)
{
LogHelper.Debug(ex);
}
}
b、在写入高频数据的时候,需要使用事务,如果反复进行(打开->插入>关闭)操作,sqlite效率1秒钟插入也就2条,使用程序进行插入就会发现输入的频率远低于获取到的数据,大量的数据被缓存到内存中,为了处理入库的速度慢,就要用到事务,事务流程:
①打开连接
②开始事务
③循环在内存中执行插入命令
④提交事务写入本地文件,如果出错回滚事务
⑤关闭连接
代码见下图,开始事务后通过SQLiteCommand的ExecuteNonQuery()方法进行内存提交
using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
{
using (SQLiteCommand cmd = new SQLiteCommand())
{
DbTransaction trans = null;
try
{
cmd.Connection = conn;
conn.Open();
//开启事务
using (trans = conn.BeginTransaction())
{
while (_list.Count > 0)
{
GpsDataClass _gps = _list[0];
try
{
if (_gps != null)
{
SQLiteHelper sh = new SQLiteHelper(cmd);
var dic = new Dictionary<string, object>();
dic["CarPlate"] = _gps.CarPlate;
dic["CarIpAddress"] = _gps.CarIpAddress;
dic["PosX1"] = _gps.PosX1;
dic["PosY1"] = _gps.PosY1;
dic["PosZ1"] = _gps.PosZ1;
dic["Heading1"] = _gps.Heading1;
dic["PosStatus1"] = _gps.PosStatus1;
dic["NumF1"] = _gps.NumF1;
dic["NumB1"] = _gps.NumB1;
dic["PosX2"] = _gps.PosX2;
dic["PosY2"] = _gps.PosY2;
dic["PosZ2"] = _gps.PosZ2;
dic["Heading2"] = _gps.Heading2;
dic["PosStatus2"] = _gps.PosStatus2;
dic["NumF2"] = _gps.NumF2;
dic["NumB2"] = _gps.NumB2;
dic["Speed"] = _gps.Speed;
dic["Signal"] = _gps.Signal;
dic["NowTime"] = _gps.NowTime;
sh.Insert("GpsRecord", dic);
_list.RemoveAt(0);
}
}
catch (Exception ex)
{
LogHelper.Debug(ex);
}
}
trans.Commit();
}
}
catch (Exception ex)
{
trans.Rollback();
LogHelper.Debug(ex);
}
conn.Close();
}
}
来源:https://blog.csdn.net/evint888/article/details/122331724


猜你喜欢
- 简介OCSP在线证书状态协议是为了替换CRL而提出来的。对于现代web服务器来说一般都是支持OCSP的,OCSP也是现代web服务器的标配。
- 今天在做项目学习的过程中,需要用到文件上传,启动项目正常,访问上传post请求突然报出了一个异常,特此记录一下。1、控制台异常org.spr
- 什么是分布式锁?在回答这个问题之前,我们先回答一下什么是锁。普通的锁,即在单机多线程环境下,当多个线程需要访问同一个变量或代码片段时,被访问
- 一、队列简介队列是一个有序列表,遵循“先入先出”的原则,即先存入队列的数据要先取出,后存入的数据后取出。队列有两种存储表示,顺序表示和链式表
- 1. 每个编译单元(文件)都只能有一个public类。即每个编译单元都有单一的公共接口,用public类实现。此时,mian()就必须要包含
- C#中的string是比特殊的类,说引用类型,但不存在堆里面,而且String str=new String("HelloWorl
- 1.构建springboot项目2.打包应用3.编写dockerfile4.构建镜像5.发布运行![root@localhost demo]
- AnimationListener听名字就知道是对Animation设置 * ,说简单点就是在Animation动画效果开始执行前,执行完毕
- 一、开发前准备1. Docker的安装可以参考https://docs.docker.com/install/2. 配置docker远程连接
- 简介 相信很多人都接触spring框架很长时间了,每次搭建spring框架的时候都需要配置好多的jar、xml,做很多繁琐重复的配置,稍微不
- 一、需要导入的jar1.commons-collections4-4.1.jar2.poi-3.17-beta1.jar3.poi-ooxm
- 简介本文用示例介绍使用MyBatis-Plus进行多表查询的方法,包括静态查询和动态查询。代码controllerpackage com.e
- 简介本文主要介绍如何使用java代码利用Selenium操作浏览器,某些网页元素加载慢,如何操作元素就会把找不到元素的异常,此时需要设置元素
- 首页在AndroidManifest.xml中添加访问数据库权限<uses-sdk android:minSdkVersion=&qu
- 模型对象的作用主要是保存数据,可以借助它们将数据带到前端。常用的模型对象有以下几个:ModelAndView(顾名思义,模型和视图,既可以携
- 很久没写文章了,一方面是最近几个月比较忙,没太多时间,另一方面是最近拖延症严重,写文章的想法总是一拖再拖。今天找一个小案例写一下,与懒惰对抗
- 1.C#是一种从C++和Java继承而来的,简单的,现代的,面向对象的语言.2.它的目标是综合Visual Basic高产和C++底层高效的
- 使用@Tolerate实现冲突兼容使用Lombok能够减少程序员的重复工作提高工作效率,而Lombok的注解基本是基于标准的(如,标准的Bu
- 1、何为依赖冲突Maven是个很好用的依赖管理工具,但是再好的东西也不是完美的。Maven的依赖机制会导致Jar包的冲突。举个例子,现在你的
- 有时候,根据业务逻辑的需求,我们想要获取到某个接口的所有实现类。在这里大致介绍两种方式:1.借助Spring容器实现Spring作为一个容器