• 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数据库并执行查询的示例:

    1. using Mono.Data.Sqlite;
    2. // 创建连接字符串
    3. string connectionString = "URI=file:example.db";
    4. // 创建SqliteConnection对象
    5. using (var connection = new SqliteConnection(connectionString))
    6. {
    7. // 打开连接
    8. connection.Open();
    9. //执行其他命令
    10. // 关闭连接
    11. connection.Close();
    12. }

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

    1. // 创建一个新的SQLiteCommand对象
    2. using (var command = new SQLiteCommand(connection))
    3. {
    4. // 设置要执行的SQL语句
    5. command.CommandText = "SELECT * FROM Customers";
    6. // 执行查询语句并获取结果
    7. using (var reader = command.ExecuteReader())
    8. {
    9. while (reader.Read())
    10. {
    11. // 处理查询结果
    12. Console.WriteLine($"ID: {reader["Id"]}, Name: {reader["Name"]}");
    13. }
    14. }
    15. }

    2.封装SQLite命令

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

    1.执行SQL命令

    1. private static SqliteConnection connection;
    2. private static SqliteCommand command;
    3. private static SqliteDataReader dataReader;
    4. /// <summary>
    5. /// 执行sql命令并返回结果
    6. /// </summary>
    7. /// <param name="sql"></param>
    8. /// <returns></returns>
    9. private static SqliteDataReader ExcuteSql(string sqlCmd)
    10. {
    11. //创建命令
    12. command = connection.CreateCommand();
    13. //指定要执行的SQL命令,比如查询、插入、更新或删除等
    14. command.CommandText = sqlCmd;
    15. //ExecuteReader用于执行语句并返回结果的方法
    16. //如果不返回结果可以使用command.ExecuteNonQuery
    17. dataReader = command.ExecuteReader();
    18. return dataReader;
    19. }

    2.连接数据库

    1. /// <summary>
    2. /// 连接数据库
    3. /// </summary>
    4. /// <param name="path">数据库路径</param>
    5. public static void OpenSQLiteFile(string path)
    6. {
    7. try
    8. {
    9. //根据数据库路径连接数据库
    10. connection = new SqliteConnection($"URI=file:{path}");
    11. //打开数据库
    12. connection.Open();
    13. Debug.Log("SQLiteFile Open...");
    14. }
    15. catch (System.Exception e)
    16. {
    17. //捕获异常,如果数据库连接失败则捕获异常
    18. Debug.LogError(e.Message);
    19. }
    20. }

    3.创建表格

    1. /// <summary>
    2. /// 创建表
    3. /// sqlCmd:CREATE TABLE tableName (column1 datatype1,column2 datatype2,column3 ///datatype3,.....columnN datatypeN)
    4. /// </summary>
    5. /// <param name="tableName"> 表的名称</param>
    6. /// <param name="columns"></param>
    7. /// <param name="columnType">类型</param>
    8. public static void CreateTable(string tableName, string[] columns, string[] columnType)
    9. {
    10. //如果字段名和字段类型长度不一致则不能创建表格
    11. if (columns.Length != columnType.Length)
    12. {
    13. Debug.LogError("Colum's Length != ColumType's Length");
    14. return;
    15. }
    16. StringBuilder cmdSrt = new StringBuilder(20);
    17. //根据参数进行创建表格SQL命令字符串拼接
    18. cmdSrt.Append($"CREATE TABLE {tableName}(");
    19. for (int i = 0; i < columns.Length; i++)
    20. {
    21. if (i > 0)
    22. {
    23. cmdSrt.Append(",");
    24. }
    25. cmdSrt.Append($"{columns[i]} {columnType[i]}");
    26. }
    27. cmdSrt.Append(")");
    28. //执行命令
    29. ExcuteSql(cmdSrt.ToString());
    30. }

    4.检查表格是否存在

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

    5.向表格中插入数据

    1. /// <summary>
    2. /// 向表中插入数据
    3. /// sqlCmd:INSERT INTO tableName VALUES(value1, value2, value3,...valueN)
    4. /// </summary>
    5. /// <param name="tableName"></param>
    6. /// <param name="insertDatas"></param>
    7. public static void InsertTableData(string tableName, string[] insertDatas)
    8. {
    9. if (insertDatas.Length == 0)
    10. {
    11. Debug.LogError("Values's length == 0");
    12. }
    13. StringBuilder cmdSrt = new StringBuilder(20);
    14. //根据参数进行创建表格SQL命令字符串拼接
    15. cmdSrt.Append($"INSERT INTO {tableName} VALUES(");
    16. for (int i = 0; i < insertDatas.Length; i++)
    17. {
    18. if (i > 0)
    19. {
    20. cmdSrt.Append(",");
    21. }
    22. cmdSrt.Append($"'{insertDatas[i].ToString()}'");
    23. }
    24. cmdSrt.Append(")");
    25. //执行插入数据命令
    26. ExcuteSql(cmdSrt.ToString());
    27. }

    6.向表格中更新数据

    1. /// <summary>
    2. /// 向表中更新数据
    3. /// sqlCmd:UPDATE tableName SET column1 = value1, column2 = value2...., columnN = valueN
    4. /// </summary>
    5. /// <param name="tableName"></param>
    6. /// <param name="updateDatas"></param>
    7. public static void UpdateTableData(string tableName, string[] updateDatas)
    8. {
    9. if (updateDatas.Length == 0)
    10. Debug.LogError("Values's length == 0");
    11. StringBuilder cmdSrt = new StringBuilder(20);
    12. //根据参数进行创建表格SQL命令字符串拼接
    13. cmdSrt.Append($"UPDATE {tableName} SET ");
    14. for (int i = 0; i < updateDatas.Length; i += 2)
    15. {
    16. if (i > 0)
    17. {
    18. cmdSrt.Append(",");
    19. }
    20. cmdSrt.Append($"'{updateDatas[i]}'='{updateDatas[i + 1]}'");
    21. }
    22. //执行更新数据命令
    23. ExcuteSql(cmdSrt.ToString());
    24. }

    7.获取表中所有数据

    1. /// <summary>
    2. /// 获取表中所有的数据
    3. /// sqlCmd:SELECT * FROM tableName
    4. /// </summary>
    5. /// <typeparam name="T"></typeparam>
    6. /// <param name="tableName"></param>
    7. /// <returns></returns>
    8. public static List<Dictionary<string, T>> GetTableAllData(string tableName)
    9. {
    10. List<Dictionary<string, T>> dataList = new List>(20);
    11. //查询命令
    12. string sql = $"SELECT * FROM {tableName}";
    13. using (var reader = ExcuteSql(sql))
    14. {
    15. //每条读取数据
    16. while (reader.Read())
    17. {
    18. Dictionary<string, T> dataDic = new Dictionary<string, T>(5);
    19. for (int i = 0; i < reader.FieldCount; i++)
    20. {
    21. //获取名称
    22. string key = reader.GetName(i);
    23. //获取Value
    24. object value = reader.GetValue(i);
    25. dataDic.Add(key, (T)value);
    26. }
    27. dataList.Add(dataDic);
    28. }
    29. }
    30. return dataList;
    31. }

  • 相关阅读:
    vue:js中合并对象的方法
    梯度消失和梯度爆炸问题详解
    Flutter饱受争议的7个缺点,大家怎么看?
    C++双整数转双字节16进制
    代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
    糖尿病患者饮食该注意些什么
    【Java基础】Java基础知识
    邮件钓鱼--有无SPF演示--Swaks
    什么是粘包和拆包,Netty如何解决粘包拆包?
    5个前端练手项目(html css js canvas)
  • 原文地址:https://blog.csdn.net/qq_27678295/article/details/136280990