Unity接入SQLite (三):C#封装SQL命令

在上一篇《Unity接入SQLite (二):SQL常用命令》介绍了常用的SQL命令,比如连接数据库、创建表、删除表、插入数据、更新数据等。这篇文章是Unity接入SQLite的实战篇,主要包括对于各种SQL命令的封装和示例。

1.介绍SQLite中重要类

与SQLite命令相关的两个类是SqliteConnection和SqliteCommand,下面就是重点简介

SqliteConnection:用于建立和管理与SQLite数据库的连接。它提供了一组方法和属性来打开、关闭、执行SQL命令和事务等操作。使用SqliteConnection,可以连接到SQLite数据库并执行后续的操作。要使用SqliteConnection,您需要先引用Mono.Data.Sqlite命名空间,并通过创建一个SqliteConnection对象来初始化连接字符串。连接字符串包括数据库的位置、名称和其他连接参数。以下是一个使用SqliteConnection连接到SQLite数据库并执行查询的示例:

using Mono.Data.Sqlite;// 创建连接字符串
string connectionString = "URI=file:example.db";// 创建SqliteConnection对象
using (var connection = new SqliteConnection(connectionString))
{// 打开连接connection.Open();//执行其他命令// 关闭连接connection.Close();
}

SqliteCommand:SqliteCommand是用于执行SQL语句或存储过程的对象。它负责将SQL语句发送到SQLite数据库,并从数据库中检索结果。它可以用来执行任何SQL语句,例如查询、插入、更新、删除等。SqliteCommand还提供了一些方法,如ExecuteNonQuery()用于执行不返回数据集的SQL语句,ExecuteScalar()用于执行返回单个值的SQL语句,ExecuteReader()用于执行返回结果集的SQL语句等。SqliteCommand还可以绑定参数,以便在SQL语句中使用参数化查询,提高安全性和效率。示例如下所示:

// 创建一个新的SQLiteCommand对象
using (var command = new SQLiteCommand(connection))
{// 设置要执行的SQL语句command.CommandText = "SELECT * FROM Customers";// 执行查询语句并获取结果using (var reader = command.ExecuteReader()){while (reader.Read()){// 处理查询结果Console.WriteLine($"ID: {reader["Id"]}, Name: {reader["Name"]}");}}
}

2.封装SQLite命令

由于各种SQLite命令是进行数据库操作频繁使用的,所以对SQLite的各种命令比如:数据库连接、创建表格、插入数据、更新数据、查询数据等进行封装,可以根据传入的参数进行相应的命令处理,方便后续调用。

1.执行SQL命令

private static SqliteConnection connection;
private static SqliteCommand command;private static SqliteDataReader dataReader;/// <summary>
/// 执行sql命令并返回结果
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
private static SqliteDataReader ExcuteSql(string sqlCmd)
{//创建命令command = connection.CreateCommand();//指定要执行的SQL命令,比如查询、插入、更新或删除等command.CommandText = sqlCmd;//ExecuteReader用于执行语句并返回结果的方法//如果不返回结果可以使用command.ExecuteNonQuerydataReader = command.ExecuteReader();return dataReader;
}

2.连接数据库

/// <summary>
/// 连接数据库
/// </summary>
/// <param name="path">数据库路径</param>
public static void OpenSQLiteFile(string path)
{try{//根据数据库路径连接数据库connection = new SqliteConnection($"URI=file:{path}");//打开数据库connection.Open();Debug.Log("SQLiteFile Open...");}catch (System.Exception e){//捕获异常,如果数据库连接失败则捕获异常Debug.LogError(e.Message);}
}

3.创建表格

/// <summary>
/// 创建表
/// sqlCmd:CREATE TABLE tableName (column1 datatype1,column2 datatype2,column3 ///datatype3,.....columnN datatypeN)
/// </summary>
/// <param name="tableName"> 表的名称</param>
/// <param name="columns"></param>
/// <param name="columnType">类型</param>
public static void CreateTable(string tableName, string[] columns, string[] columnType)
{//如果字段名和字段类型长度不一致则不能创建表格if (columns.Length != columnType.Length){Debug.LogError("Colum's Length != ColumType's Length");return;}StringBuilder cmdSrt = new StringBuilder(20);//根据参数进行创建表格SQL命令字符串拼接cmdSrt.Append($"CREATE TABLE {tableName}(");for (int i = 0; i < columns.Length; i++){if (i > 0){cmdSrt.Append(",");}cmdSrt.Append($"{columns[i]} {columnType[i]}");}cmdSrt.Append(")");//执行命令ExcuteSql(cmdSrt.ToString());
}

4.检查表格是否存在

/// <summary>
/// 检查表是否存在
/// sqlCmd:SELECT COUNT(*) FROM sqlite_master WHERE type ='table' and name=tableName
/// </summary>
public static bool CheckTableExists(string tableName)
{string sql = $"SELECT COUNT(*) FROM sqlite_master WHERE type ='table' and name='{tableName}';";//创建命令command = connection.CreateCommand();command.CommandText = sql;//获取返回结果int count = Convert.ToInt32(command.ExecuteScalar());//如果结果为1则表示存在该表格bool isExists = count == 1;return isExists;
}

5.向表格中插入数据

/// <summary>
/// 向表中插入数据
/// sqlCmd:INSERT INTO tableName VALUES(value1, value2, value3,...valueN)
/// </summary>
/// <param name="tableName"></param>
/// <param name="insertDatas"></param>
public static void InsertTableData(string tableName, string[] insertDatas)
{if (insertDatas.Length == 0){Debug.LogError("Values's length == 0");}StringBuilder cmdSrt = new StringBuilder(20);//根据参数进行创建表格SQL命令字符串拼接cmdSrt.Append($"INSERT INTO {tableName} VALUES(");for (int i = 0; i < insertDatas.Length; i++){if (i > 0){cmdSrt.Append(",");}cmdSrt.Append($"'{insertDatas[i].ToString()}'");}cmdSrt.Append(")");//执行插入数据命令ExcuteSql(cmdSrt.ToString());}

6.向表格中更新数据

/// <summary>
/// 向表中更新数据
/// sqlCmd:UPDATE tableName SET column1 = value1, column2 = value2...., columnN = valueN
/// </summary>
/// <param name="tableName"></param>
/// <param name="updateDatas"></param>
public static void UpdateTableData(string tableName, string[] updateDatas)
{if (updateDatas.Length == 0)Debug.LogError("Values's length == 0");StringBuilder cmdSrt = new StringBuilder(20);//根据参数进行创建表格SQL命令字符串拼接cmdSrt.Append($"UPDATE {tableName} SET ");for (int i = 0; i < updateDatas.Length; i += 2){if (i > 0){cmdSrt.Append(",");}cmdSrt.Append($"'{updateDatas[i]}'='{updateDatas[i + 1]}'");}//执行更新数据命令ExcuteSql(cmdSrt.ToString());}

7.获取表中所有数据

/// <summary>
/// 获取表中所有的数据 
/// sqlCmd:SELECT * FROM tableName
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tableName"></param>
/// <returns></returns>
public static List<Dictionary<string, T>> GetTableAllData<T>(string tableName)
{List<Dictionary<string, T>> dataList = new List<Dictionary<string, T>>(20);//查询命令string sql = $"SELECT * FROM {tableName}";using (var reader = ExcuteSql(sql)){//每条读取数据while (reader.Read()){Dictionary<string, T> dataDic = new Dictionary<string, T>(5);for (int i = 0; i < reader.FieldCount; i++){//获取名称string key = reader.GetName(i);//获取Valueobject value = reader.GetValue(i);dataDic.Add(key, (T)value);}dataList.Add(dataDic);}}return dataList;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/705953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源软件:塑造软件行业未来的协作与创新之力

随着信息技术的迅猛发展&#xff0c;开源软件已经逐渐成为软件开发的潮流&#xff0c;以其独特的低成本、可协作性和透明度等特性&#xff0c;在全球范围内引起了广泛的关注和应用。越来越多的企业和个人选择使用开源软件&#xff0c;这不仅推动了软件行业的繁荣&#xff0c;还…

小程序应用、页面、组件生命周期

引言 微信小程序生命周期是指在小程序运行过程中&#xff0c;不同阶段触发的一系列事件和函数。这一概念对于理解小程序的整体架构和开发流程非常重要。本文将介绍小程序生命周期的概念以及在不同阶段触发的关键事件&#xff0c;帮助开发者更好地理解和利用小程序的生命周期。 …

人工智能大学课程-ChatGPT生成

抖动的声音&#xff1a;dilo_Abel 视频号&#xff1a;dilo_Abel的个人空间-dilo_Abel个人主页-哔哩哔哩视频 年级课程名称推荐书籍书籍内容描述说明大一年级计算机科学导论"Computer Science: An Overview" by J. Glenn Brookshear介绍计算机科学的基本概念、原理和…

Maven jar 的查找及依赖版本确定

关于 jar 的查找&#xff0c;及使用版本的确定&#xff0c;及依赖的版本确认&#xff0c;避免 jar 冲突或版本不兼容 在使用 maven 构建项目时&#xff0c;需要的 jar 可以通过在 https://mvnrepository.com/ 可以找到部分需要的依赖&#xff0c;这里以查找 mybatis 依赖为例&…

torch.nn.embedding的介绍和用法

nn.Embedding 是 PyTorch 中的一个神经网络层&#xff0c;它主要用于将离散的、高维的数据&#xff08;如词索引&#xff09;转换为连续的、低维的空间中的稠密向量表示。 在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;这个层通常用于实现词嵌入&#xff08;Word E…

axios封装

一、axios是什么特性基本使用二、为什么要封装三、如何封装设置接口请求前缀设置请求头与超时时间封装请求方法请求拦截器响应拦截器小结 一、axios是什么 axios 是一个轻量的 HTTP客户端 基于 XMLHttpRequest 服务来执行 HTTP 请求&#xff0c;支持丰富的配置&#xff0c;支…

shell和go实现:防火墙放行所有端口,唯独拦截80端口

shell 1.防火墙放行所有端口&#xff0c;唯独拦截80端口 1.1拦截 mkdir -p /data/shellscat > /data/shells/02nginx_close.sh <<-EOF #!/bin/bash# 检查Linux系统版本 linux_version$(cat /etc/redhat-release)# 根据Linux系统版本选择相应的防火墙开启命令和保存…

python入门介绍

目录 内存 外存&#xff08;硬盘等&#xff09;区别 显卡&#xff1a; python的优缺点 内存 外存&#xff08;硬盘等&#xff09;区别 内存的存储空间小&#xff0c;外存的存储空间大内存的访问速度快&#xff0c;外存的访问速度慢内存比外存成本更高内存上的数据容易丢失&…

MongoDB - writeConcern

writeConcern 是 MongoDB 提供的一个功能&#xff0c;用于控制写操作的确认级别&#xff0c;以确保数据的持久性和一致性。在分布式环境中&#xff0c;写入操作可能会面临网络延迟、节点故障等情况&#xff0c;writeConcern 允许您指定在写入数据时所需的确认级别&#xff0c;以…

ZTE E8820V2重启偶现5G wifi丢失问题

使用ZTE E8820V2设备时,发现设备在多次重启过程中会出现5G wifi信号丢失的情况。 1. 现象日志 使用老毛子固件,具体丢失时会出现相关log: 2. 问题原因: GPIO#19 是 PCIE reset 外,GPIO#26 也要 reset。 3. 解决方法: E8820V2/rt-n56u/trunk$ git diff linux-3.4.x…

Aethir推出其首次去中心化AI节点售卖

Aethir&#xff0c;去中心化GPU云基础设施领导者&#xff0c;宣布其备受期待的节点销售。Aethir是一家企业级的以AI和游戏为重点的GPU即服务提供商。Aethir的去中心化云计算基础设施使GPU提供商能够与需要NVIDIA的H100芯片提供强大AI/ML任务支持的企业客户相连接。 此外&#x…

BUU [CISCN2019 华东南赛区]Web4

BUU [CISCN2019 华东南赛区]Web4 题目描述&#xff1a;Click to launch instance. 开题&#xff1a; 点击链接&#xff0c;有点像SSRF 使用local_file://协议读到本地文件&#xff0c;无法使用file://协议读取&#xff0c;有过滤。 local_file://协议&#xff1a; local_file…

JavaWeb 自己给服务器安装SQL Server数据库遇到的坑

之前买的虚拟主机免费送了一个SQL Server数据库&#xff0c;由于服务器提供商今年下架我用的那款虚拟主机产品&#xff0c;所以数据库也被收回了。我买了阿里云云服务器&#xff0c;但是没有数据库&#xff0c;于是自己装了一个SQL Server数据库&#xff0c;总结一下遇到的坑。…

小程序画布(二维地图线)

首先开始是想用小程序兼容openlayers的&#xff0c;但是了解到用不了&#xff0c;那就用画布来解决 实际效果如下 wxml中代码 <canvas id"trackDesignCanvas" //指定 id 的 Canvas 组件class"orbit-canvas-main" type"2d" …

安卓平板主板_安卓平板电脑主板MTK联发科|高通|紫光展锐方案

安卓平板电脑主板选择了MTK联发科方案&#xff0c;并且可以选配高通或者紫光展锐平台方案&#xff0c;为用户提供更强劲的性能和定制化的服务。主板搭载了联发科MT6771处理器&#xff0c;采用12nm制程工艺&#xff0c;拥有八核Cortex-A73Coretex-A53架构&#xff0c;主频为2.0G…

Nest.js权限管理系统开发(七)用户注册

创建user模块 先用nest的命令创建一个 user 模块&#xff0c; nest g res user 实现user实体 然后就生成了 user 模块,在它的实体中创建一个用户表user.entity.ts&#xff0c;包含 id、用户名、密码,头像、邮箱等等一些字段&#xff1a; Entity(sys_user) export class Us…

【底层学习】HashMap源码学习

成员变量 // 默认初始容量 就是16 static final int DEFAULT_INITIAL_CAPACITY 1 << 4; // aka 16// 最大容量 static final int MAXIMUM_CAPACITY 1 << 30;// 默认加载因子0.75 static final float DEFAULT_LOAD_FACTOR 0.75f;// 树化阈值&#xff08;链表转为…

IT廉连看——C语言——结构体

IT廉连看——C语言——结构体 一、结构体的声明 1.1 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag {member-list; }variable-list; 例如描述一个学生&#xff1a;typedef struct Stu…

SQL Server添加用户登录

我们可以模拟一下让这个数据库可以给其它人使用 1、在计算机中添加一个新用户TeacherWang 2、在Sql Server中添加该计算机用户的登录权限 exec sp_grantlogin LAPTOP-61GDB2Q7\TeacherWang -- 之后这个计算机用户也可以登录数据库了 3、添加数据库的登录用户和密码&#xff0…

进程与线程之线程

首先exec函数族是进程中的常用函数&#xff0c;可以利用另外的进程空间执行不同的程序&#xff0c;在之前的fork创建子进程中会完全复制代码数据段等&#xff0c;而exec函数族则可以实现子进程实现不同的代码 int execl(const char *path, const char *arg, ... …