当前位置: 首页 > news >正文

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;
}

相关文章:

  • 蓝桥杯倒计时47天!DFS基础——图的遍历
  • 如何将域名解析成IP地址?
  • EfficientSAM | 借助MIM机制,MetaAI让SAM更高效!
  • 编程笔记 html5cssjs 092 JavaScript 表单控件
  • 防火墙的内容安全
  • 顶顶通呼叫中心中间件-如何使处于机器人话术中的通话手动转接到坐席分机上讲解(mod_cti基于FreeSWITCH)
  • Qt篇——QTableWidget保存表格数据到Excel文件中,读Excel内容到QTableWidget
  • 人工智能之Tensorflow程序结构
  • 信息安全计划
  • hive中如何取交集并集和差集
  • ES项目应用
  • 用html编写的小广告板
  • MongoDB之MongoDBConnectorBI安装与使用
  • 算法【线性表的查找-顺序查找】
  • 4核8g服务器能支持多少人访问?
  • 0x05 Python数据分析,Anaconda八斩刀
  • 78. Subsets
  • CSS实用技巧
  • hadoop集群管理系统搭建规划说明
  • Java多态
  • JSONP原理
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Octave 入门
  • QQ浏览器x5内核的兼容性问题
  • 聊聊flink的TableFactory
  • 前端工程化(Gulp、Webpack)-webpack
  • 人脸识别最新开发经验demo
  • 日剧·日综资源集合(建议收藏)
  • 什么是Javascript函数节流?
  • 思否第一天
  • 学习Vue.js的五个小例子
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 容器镜像
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ![CDATA[ ]] 是什么东东
  • ###C语言程序设计-----C语言学习(6)#
  • (1)虚拟机的安装与使用,linux系统安装
  • (第二周)效能测试
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)IOS中获取各种文件的目录路径的方法
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET/C# 的字符串暂存池
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET的数据绑定
  • /bin/rm: 参数列表过长"的解决办法
  • @RestController注解的使用
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • []sim300 GPRS数据收发程序
  • [100天算法】-二叉树剪枝(day 48)