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.ExecuteNonQuery
    dataReader = 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);
                //获取Value
                object value = reader.GetValue(i);
                dataDic.Add(key, (T)value);
            }

            dataList.Add(dataDic);
        }
    }

    return dataList;
}
相关推荐
两水先木示几秒前
【Unity3D】ECS入门学习(六)状态组件 ISystemStateComponentData
学习·unity·ecs
Thomas_YXQ3 分钟前
Unity3D Huatuo:划时代的原生C#热更新技术详解
开发语言·游戏·unity·c#·unity3d
计算机学无涯1 小时前
Spring事务回滚
数据库·sql·spring
Unity_RAIN10 小时前
Unity 战斗系统中角色UI血条设计
ui·unity·游戏引擎
天冬忘忧10 小时前
Flink优化----FlinkSQL 调优
大数据·sql·flink
先生沉默先14 小时前
unity使用代码在动画片段中添加event
unity
后端转全栈_小伵14 小时前
MySQL外键类型与应用场景总结:优缺点一目了然
数据库·后端·sql·mysql·学习方法
浅陌sss15 小时前
Unity性能优化 --- 减少OverDraw
unity·性能优化·游戏引擎
向宇it16 小时前
【从零开始入门unity游戏开发之——C#篇30】C#常用泛型数据结构类——list<T>列表、`List<T>` 和数组 (`T[]`) 的选择
java·开发语言·数据结构·unity·c#·游戏引擎·list
keep-learner16 小时前
Unity Dots理论学习-2.ECS有关的模块(1)
学习·unity·游戏引擎