一、什么是sqlite
sqlite 是一个轻量级的数据库管理系统,它不需要一个独立的服务器进程或操作系统的运行,而是将整个数据库,包括定义、表、索引以及数据本身,全部存储在一个独立的磁盘文件中。sqlite 被设计为简单易用,它支持 sql 语言的大部分功能,并且是跨平台的,可以在多种操作系统和硬件平台上运行,包括桌面、服务器、移动设备等。
sqlite 的主要特点包括:
轻量级:sqlite 的源代码体积小,编译后的库文件也非常小巧,便于集成到各种应用程序中。
无需配置:与需要复杂配置和安装过程的数据库系统不同,sqlite 不需要任何配置就可以直接使用。
跨平台:sqlite 可以在多种操作系统上运行,包括 windows、macos、linux、android 和 ios 等。
自包含:sqlite 是一个自包含的库,应用程序可以通过简单的 api 调用直接与数据库交互。
事务性:sqlite 支持事务,这意味着你可以确保数据的完整性,即使在发生错误或系统崩溃的情况下。
并发控制:sqlite 提供了一定程度的并发控制,允许多个进程或线程同时访问数据库。
开源:sqlite 是一个开源项目,遵循宽松的公共领域许可证,可以免费使用,甚至可以在商业产品中使用。
二、c#调用sqlite
c#调用sqlite只需要使用system.data.sqlite这个库即可,无需安装sql,调用这个库即可在本地进行数据处理,轻量方便。
你可以通过nuget包管理器来安装system.data.sqlite
库。在visual studio中,你可以通过“工具”->“nuget包管理器”->“包管理器控制台”来安装。
三、编写sqlite的helper类
sqlite本身是sql的语言进行编写的,如果你会使用sql,那么调用对你而言没有什么难度;如果你不太会sql,那么可以使用笔者的helper类帮助你快速使用sqlite。
using system; using system.collections.generic; using system.data; using system.data.sqlite; using system.linq; using system.io; namespace sqlitetest { public class sqlitehelper { /*******条件语法*******/ //1.简单的删除条件:age > 40 //2.使用逻辑运算符:age > 40 and country = 'usa' //3.使用in运算符:in运算符用于指定列的值必须属于一个特定的值列表:category in ('electronics', 'books', 'toys') //4.使用like运算符:like运算符用于在列的值中搜索特定的模式(通常用于字符串) username like 'j%'; //5.使用between运算符:orderdate between '2023-01-01' and '2023-03-31' //6.使用is null 或 is not null:manager is null // 用于与sqlite数据库交互的连接对象 private sqliteconnection connection; // 操作的表名 private string tablename; // 表的列名,以逗号分隔的字符串 private string columnnamestr; //表的列名 private string[] columnnames; /// <summary> /// 通过指定的数据库文件路径初始化sqlitehelper类的实例。 /// </summary> /// <param name="dbaddress">数据库文件的路径。</param> public sqlitehelper(string dbaddress) { // 创建sqlite连接字符串构建器,并设置数据源和版本 var connectionstringbuilder = new sqliteconnectionstringbuilder { datasource = dbaddress, version = 3 }; // 通过连接字符串构建器创建sqlite连接对象 connection = new sqliteconnection(connectionstringbuilder.connectionstring); // 打开数据库连接 connection.open(); } /// <summary> /// 关闭数据库连接。 /// </summary> public void close() { // 如果连接不为空且状态为打开,则关闭连接 if (connection != null && connection.state == connectionstate.open) { connection.close(); } } /// <summary> /// 创建表,包括指定的列和类型。 /// </summary> /// <param name="tablename">要创建的表名。</param> /// <param name="hasautoincrementid">是否自动添加自增id。</param> /// <param name="columns">列名数组。</param> /// <param name="columntypes">列类型数组。</param> public void createtable(string tablename, bool hasautoincrementid, string[] columns, type[] columntypes) { // 设置当前操作的表名 this.tablename = tablename; // 设置列名字符串 columnnamestr = string.join(",", columns); columnnames = columns; // 创建列定义列表 var columndefinitions = new list<string>(); // 如果需要自动添加id列 if (hasautoincrementid) { columndefinitions.add("id integer primary key autoincrement"); } // 遍历列类型数组,添加列定义 for (int i = 0; i < columns.length; i++) { var columnname = columns[i]; var columntypestr = getcolumntype(columntypes[i]); columndefinitions.add($"{columnname} {columntypestr}"); } // 构建列定义字符串 string columndefinitionsstr = string.join(", ", columndefinitions); // 构建创建表的sql语句 string sqlstr = $"create table if not exists {tablename} ({columndefinitionsstr});"; // 执行非查询sql命令创建表 executenonquery(sqlstr); } /// <summary> /// 删除当前的表 /// </summary> public void deletetable() { string sql = $"drop table if exists {tablename};"; executenonquery(sql); } /// <summary> /// 创建索引以提高查询效率,在创建表之后使用 /// </summary> /// <param name="columnname">要创建索引的列名。</param> public void createindex(string columnname) { string sql = $"create index if not exists {columnname} on {tablename} ({columnname});"; executenonquery(sql); } /// <summary> /// 销毁指定的索引。 /// </summary> /// <param name="indexname">要删除的索引的名称。</param> public void deleteindex(string columnname) { string sql = $"drop index if exists {columnname};"; executenonquery(sql); } /// <summary> /// 获取c#类型对应的sqlite类型字符串。 /// </summary> /// <param name="type">c#中的类型。</param> /// <returns>对应的sqlite类型字符串。</returns> private string getcolumntype(type type) { // 根据c#类型返回对应的sqlite类型字符串 switch (type.gettypecode(type)) { case typecode.int32: case typecode.uint32: case typecode.int64: case typecode.uint64: return "integer"; case typecode.double: return "real"; case typecode.single: return "float"; case typecode.datetime: return "datetime"; case typecode.boolean: return "boolean"; default: return "text"; } } /// <summary> /// 向表中插入记录。 /// </summary> /// <param name="values">要插入的值的数组。</param> /// <returns>插入操作影响的行数。</returns> public int insert(params object[] values) { // 创建参数列表并初始化 var parameters = values.select((value, index) => new sqliteparameter($"@{index}", value)).toarray(); // 构建参数化sql语句 var parameternames = string.join(", ", parameters.select(p => p.parametername)); // 构建插入数据的sql语句 string sql = $"insert into {tablename} ({columnnamestr}) values ({parameternames});"; // 执行非查询sql命令并返回影响的行数 return executenonquery(sql, parameters); } /// <summary> /// 获取多条件的字符串组合 /// </summary> /// <param name="band">true为and逻辑,false 为 or 逻辑</param> /// <param name="condition1"></param> /// <param name="condition2"></param> /// <param name="conditions"></param> /// <returns></returns> public string getmulticontidion(bool band, string condition1, string condition2, params string[] conditions) { if (band) { if (conditions != null && conditions.length > 0) { string str1 = string.join(" and ", conditions); return string.join(" and ", condition1, condition2, str1); } else { return string.join(" and ", condition1, condition2); } } else { if (conditions != null && conditions.length > 0) { string str1 = string.join(" or ", conditions); return string.join(" or ", condition1, condition2, str1); } else { return string.join(" or ", condition1, condition2); } } } /// <summary> /// 根据条件删除记录。 /// </summary> /// <param name="condition">删除条件。</param> /// <returns>删除操作影响的行数。</returns> public int delete(string condition) { // 构建删除数据的sql语句 string sql = $"delete from {tablename} where {condition};"; // 执行非查询sql命令并返回影响的行数 return executenonquery(sql); } /// <summary> /// 更新表中的记录。 /// </summary> /// <param name="columnname">要更新的列名。</param> /// <param name="value">新的值。</param> /// <param name="condition">更新条件。</param> /// <returns>更新操作影响的行数。</returns> public int update(string columnname, object value, string condition) { // 构建更新数据的sql语句 string query = $"update {tablename} set {columnname} = @{value} where {condition};"; // 创建参数对象并添加到sql命令中 var parameter = new sqliteparameter(value.tostring(), value); // 执行非查询sql命令并返回影响的行数 return executenonquery(query, parameter); } /// <summary> /// 根据条件查询列的值。 /// </summary> /// <param name="columnname">要查询的列名。</param> /// <param name="condition">查询条件。</param> /// <returns>查询结果的值。</returns> public object getvalue(string columnname, string condition) { // 构建查询数据的sql语句 string selectquery = $"select {columnname} from {tablename} where {condition};"; // 执行查询sql命令并返回查询结果 return executescalar(selectquery); } /// <summary> /// 根据条件查询列的值。 /// </summary> /// <param name="columnname">要查询的列名。</param> /// <param name="condition">查询条件。</param> /// <returns>查询结果的值。</returns> public list<object> getvalues(string columnname, string condition) { list<object> values = new list<object>(); string selectquery = ""; if (string.isnullorwhitespace(condition)) { selectquery = $"select {columnname} from {tablename};"; } else { selectquery = $"select {columnname} from {tablename} where {condition};"; } try { using (var reader = executequery(selectquery)) { while (reader.read()) { values.add(reader[columnname]); } } } catch (exception ex) { logexception(ex); } return values; } /// <summary> /// 根据条件获取所有行的数据 /// </summary> /// <param name="condition"></param> /// <returns></returns> public list<dictionary<string, object>> getrowdatas(string condition) { list<dictionary<string, object>> values = new list<dictionary<string, object>>(); string selectquery = ""; if (string.isnullorwhitespace(condition)) { selectquery = $"select {columnnamestr} from {tablename};"; } else { selectquery = $"select {columnnamestr} from {tablename} where {condition};"; } try { using (var reader = executequery(selectquery)) { while (reader.read()) { dictionary<string,object > dict = new dictionary<string,object>(); foreach (var columnname in columnnames) { dict.add(columnname, reader[columnname]); } values.add(dict); } } } catch (exception ex) { logexception(ex); } return values; } /// <summary> /// 执行非查询sql命令(如insert, update, delete)。 /// </summary> /// <param name="sql">sql命令字符串。</param> /// <param name="parameters">sql命令参数数组。</param> /// <returns>命令执行影响的行数。</returns> public int executenonquery(string sql, params sqliteparameter[] parameters) { try { // 使用sqlitecommand对象执行sql命令 using (var command = connection.createcommand()) { command.commandtext = sql; if (parameters != null) { command.parameters.addrange(parameters); } return command.executenonquery(); } } catch (exception ex) { // 记录异常信息到日志文件 logexception(ex); return 0; } } /// <summary> /// 执行查询sql命令(如select),返回sqlitedatareader对象。 /// </summary> /// <param name="sql">sql命令字符串。</param> /// <returns>sqlitedatareader对象。</returns> private sqlitedatareader executequery(string sql) { try { using (var command = connection.createcommand()) { command.commandtext = sql; return command.executereader(); } } catch (exception ex) { logexception(ex); return null; } } /// <summary> /// 执行查询sql命令(如select),返回单个结果。 /// </summary> /// <param name="sql">sql命令字符串。</param> /// <returns>查询结果的单个值。</returns> private object executescalar(string sql) { try { using (var command = connection.createcommand()) { command.commandtext = sql; return command.executescalar(); } } catch (exception ex) { logexception(ex); return null; } } /// <summary> /// 记录异常信息到日志文件。 /// </summary> /// <param name="ex">要记录的异常对象。</param> private void logexception(exception ex) { // 将异常信息追加到日志文件中 string errormessage = $"发生错误:{ex.message}{environment.newline}{ex.stacktrace}"; file.appendalltext("error.log", errormessage); } } }
四、如何使用sqlitehelper类
直接给出测试代码,根据根据测试代码了解封装的用法
在这个例子中,首先创建了一个sqlitehelper
实例,并指定了数据库文件的路径。然后,使用createtable
方法创建了一个名为articles
的表,用于存储文章的标题、内容、作者和创建日期。
接下来,通过insert
方法向表中插入了一条文章记录。然后,使用getrowdatas
方法查询了包含特定关键词的文章,并打印了查询结果。
之后,通过update
方法更新了文章的标题。注意,这里的更新条件是id = 1
,这意味着只有id为1的文章会被更新。
接着,通过delete
方法删除了id为1的文章记录。
还展示了如何创建和删除索引来提高查询效率。在这个例子中,首先为title
列创建了一个索引,然后又删除了它。
最后,调用close
方法关闭了数据库连接。
using system; class program { static void main() { // 数据库文件路径 string dbpath = "blog.db"; // 创建sqlitehelper实例 sqlitehelper dbhelper = new sqlitehelper(dbpath); // 1. 创建文章表 dbhelper.createtable("articles", hasautoincrementid: true, columns: new string[] { "title", "content", "author", "createdate" }, columntypes: new type[] { typeof(string), typeof(string), typeof(string), typeof(datetime) }); // 2. 插入文章 object[] article1 = new object[] { "我的旅行日记", "这是一篇关于旅行的日记。", "小明", datetime.now }; int rowsaffected = dbhelper.insert(article1); console.writeline($"插入文章记录,影响行数:{rowsaffected}"); // 3. 查询文章 string condition = "title like '%旅行%'"; list<object> articles = dbhelper.getrowdatas(condition); console.writeline("查询包含'旅行'的文章:"); foreach (var article in articles) { console.writeline($"标题: {article["title"]}, 作者: {article["author"]}, 创建日期: {article["createdate"]}"); } // 4. 更新文章 object[] article2 = new object[] { "更新的旅行日记", "这是一篇更新后的关于旅行的日记。" }; int updaterowsaffected = dbhelper.update("title", article2[0], "id = 1"); console.writeline($"更新文章记录,影响行数:{updaterowsaffected}"); // 5. 删除文章 int deleterowsaffected = dbhelper.delete("id = 1"); console.writeline($"删除文章记录,影响行数:{deleterowsaffected}"); // 6. 创建索引以提高查询效率 dbhelper.createindex("title"); // 7. 删除不再需要的索引 dbhelper.deleteindex("title"); // 8. 关闭数据库连接 dbhelper.close(); } }
五、db文件查看器
使用sqlitespy这个文件即可查看数据库文件,方便排查问题
总结
到此这篇关于c#调用sqlite的文章就介绍到这了,更多相关c#调用sqlite内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论