unityzgy/Assets/Scripts/PublicTool/DBAccess.cs
ayuan9957 bf12e02276 feat: 多语言本地化系统 - 支持中/英/法/俄实时切换
- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg)
- LoginPanel: InputField placeholder本地化、字体颜色保持
- HistoryPanel: 用时数据本地化、placeholder本地化
- RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建)
- AppraiseWindowBase: 评价等级本地化、操作消息重建
- EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized
- StudentOperateRecorder: 新增InjectOperateMsgLocalized方法
- LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选
- 字体切换时保留颜色和verticalOverflow
2026-07-16 10:05:59 +08:00

317 lines
11 KiB
C#

using UnityEngine;
using System.Collections;
using Mono.Data.Sqlite;
using System.Data;
using System;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Runtime.Serialization;
/// <summary>
/// 数据库操作工具类 封装了通用的数据库增、删、改、查接口
/// </summary>
public class DBAccess {
private SqliteConnection dbConnection;
private SqliteCommand dbCommand;
private SqliteDataReader reader;
public bool isOpen=false;
public DBAccess(string connectionStr)
{
OpenDB(connectionStr);
}
private void OpenDB(string connectionStr)
{
try
{
dbConnection = new SqliteConnection(connectionStr);
dbConnection.Open();
isOpen = true;
Debug.Log("数据库连接成功!");
}
catch
{
isOpen = false;
Debug.Log("数据库连接失败");
throw new Exception("数据库连接异常!");
}
}
/// <summary>
/// 断开数据库连接
/// </summary>
public void CloseSqlConnectionDB()
{
if(dbCommand!=null)
{
dbCommand.Dispose();
}
dbCommand = null;
if(reader!=null)
{
reader.Close();
}
reader = null;
if(dbConnection!=null)
{
dbConnection.Close();
dbConnection.Dispose();
}
dbConnection = null;
Debug.Log("数据库连接已断开");
}
/// <summary>
/// 根据键入的命令,操作数据库
/// </summary>
/// <param name="sqlQuery">需要读取的方式及内容</param>
/// <returns></returns>
public SqliteDataReader ExecuteQuery(string sqlQuery)
{
dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = sqlQuery;
reader = dbCommand.ExecuteReader();
return reader;
}
/// <summary>
/// 直接操作数据库的接口
/// </summary>
/// <param name="sqliteParameters"></param>
/// <param name="CommandText"></param>
/// <returns></returns>
public SqliteDataReader ExecuteQuery(SqliteParameter[] sqliteParameters, string CommandText)
{
dbCommand = dbConnection.CreateCommand();
dbCommand.Parameters.AddRange(sqliteParameters);
dbCommand.CommandText = CommandText;
reader = dbCommand.ExecuteReader();
return reader;
}
/// <summary>
/// 读取整张数据表
/// </summary>
/// <param name="tableName"></param>
/// <returns></returns>
public SqliteDataReader ReaderFullTable( string tableName)
{
string query = "SELECT * FROM " + tableName;
return ExecuteQuery(query);
}
/// <summary>
/// 更新指定数据表内的数据
/// </summary>
/// <returns>The values.</returns>
/// <param name="tableName">数据表名称</param>
/// <param name="colNames">字段名</param>
/// <param name="colValues">字段名对应的数据</param>
/// <param name="key">关键字</param>
/// <param name="value">关键字对应的值</param>
public bool UpdateValues(string tableName,string[] colNames,string[] colValues,string key,string operation,string value)
{
//当字段名称和字段数值不对应时引发异常
if(colNames.Length!=colValues.Length) {
throw new SqliteException("colNames.Length!=colValues.Length");
}
string queryString = "UPDATE " + tableName + " SET " + colNames[0] + "=" + $"'{colValues[0]}'";
for(int i=1; i<colValues.Length; i++)
{
queryString+=", " + colNames[i] +$"='{colValues[i]}'" ;
}
queryString += " WHERE " + key + operation + $" '{value}' ";
return ExecuteQuery(queryString).RecordsAffected>0;
}
/// <summary>
/// 删除指定数据表内的数据
/// </summary>
/// <returns>The values.</returns>
/// <param name="tableName">数据表名称</param>
/// <param name="colNames">字段名</param>
/// <param name="colValues">字段名对应的数据</param>
public bool DeleteValuesOR(string tableName,string[] colNames,string[] operations,string[] colValues)
{
//当字段名称和字段数值不对应时引发异常
if(colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length) {
throw new SqliteException("colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length");
}
string queryString = "DELETE FROM " + tableName + " WHERE " + colNames[0] + operations[0] + colValues[0];
for(int i=1; i<colValues.Length; i++)
{
queryString+="OR " + colNames[i] + operations[0] + colValues[i];
}
return ExecuteQuery(queryString).RecordsAffected > 0;
}
/// <summary>
/// 删除指定数据表内的数据
/// </summary>
/// <returns>The values.</returns>
/// <param name="tableName">数据表名称</param>
/// <param name="colNames">字段名</param>
/// <param name="operations">运算符</param>
/// <param name="colValues">字段名对应的数据</param>
public bool DeleteValuesAND(string tableName,string[] colNames,string[] operations,string[] colValues)
{
//当字段名称和字段数值不对应时引发异常
if(colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length) {
throw new SqliteException("colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length");
}
string queryString = "DELETE FROM " + tableName + " WHERE " + colNames[0] + operations[0] + colValues[0];
for(int i=1; i<colValues.Length; i++)
{
queryString+=" AND " + colNames[i] + operations[i] + colValues[i];
}
return ExecuteQuery(queryString).RecordsAffected>0;
}
///<summary>
///在数据库中创建表格
///</summary>
///<param name="name">表格名称</param>
///<param name="col">表格所有的列名</param>
///<param name="colType">表格所有列所对应的格式</param>
///<returns></returns>
public SqliteDataReader CreatTable(string name,string [] col,string []colType)
{
if(col.Length!=colType.Length)
{
throw new SqliteException("创建的数据类型与数据本身未对应!");
}
string query = "CREATE TABLE " + name + " (" + col[0] + " "+colType[0];
for (int i = 1; i < col.Length; i++)
{
query += ", " + col[i] + " "+colType[i];
}
query += ")";
return ExecuteQuery(query);
}
/// <summary>
/// 插入表格内容
/// </summary>
/// <param name="tableName">表格名称</param>
/// <param name="values">插入的值,需对应数据库中该表格的行格式</param>
/// <returns></returns>
public SqliteDataReader InsterInto(string tableName, string[] values)
{
string query = "INSERT INTO " + tableName + " VALUES(" + $"'{values[0]}'";
for (int i = 1; i < values.Length; i++)
{
query += (", " + $"'{values[i]}'");
}
query += ")";
return ExecuteQuery(query);
}
/// <summary>
/// 根据条件查找相应的值
/// </summary>
/// <param name="tableName">表格命</param>
/// <param name="items">需要得到值的列名</param>
/// <param name="key">条件的列名</param>
/// <param name="value">条件值</param>
/// <returns></returns>
public SqliteDataReader Select(string tableName, string[] items, string[] key,string[] value)
{
if(key.Length!=value.Length)
{
throw new SqliteException("比较条件未满足!");
}
string query = "SELECT " + items[0];
for (int i = 1; i < items.Length; i++)
{
query += "," + items[i];
}
query += " FROM " + tableName + " WHERE " + key[0] + "=" + $"'{value[0]}'";
for (int i = 1; i < key.Length; i++)
{
query += " AND " + key[i] + "=" + $"'{value[i]}'";
}
return ExecuteQuery(query);
}
/// <summary>
/// 查询一个表中指定列的所有数据
/// </summary>
/// <param name="tableName"></param>
/// <param name="item">列名称</param>
/// <returns></returns>
public SqliteDataReader GetAllLineMess(string tableName,string item)
{
string query="SELECT DISTINCT "+item+" FROM "+tableName;
return ExecuteQuery(query);
}
/// <summary>
/// 按时间段查找所有的值
/// </summary>
/// <param name="tableName"></param>
/// <param name="startTime">开始时间 注意格式为"yyyy-m-dd hh:mm:ss"</param>
/// <param name="finishTime">结束时间 注意格式为"yyyy-m-dd hh:mm:ss"</param>
/// <returns></returns>
public SqliteDataReader SelectTime(string tableName,string key,string startTime,string finishTime)
{
string query = "SELECT * FROM " + tableName + " WHERE " + key + " BETWEEN " + $"'{startTime}'" + " AND " + $"'{finishTime}'";
return ExecuteQuery(query);
}
/// <summary>
/// 根据一个键和值查找
/// </summary>
/// <param name="tableName"></param>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public SqliteDataReader Select(string tableName, string key, string value)
{
string query = "SELECT * FROM " + tableName + " WHERE " + key + "=" +$"'{value}'" ;
return ExecuteQuery(query);
}
/// <summary>
/// 根据时间段和一个键和值进行查找
/// </summary>
/// <param name="tableName"></param>
/// <param name="timeKey"></param>
/// <param name="startTime">注意格式为"yyyy-m-dd hh:mm:ss"</param>
/// <param name="finishTime">注意格式为"yyyy-m-dd hh:mm:ss"</param>
/// <param name="nameKey"></param>
/// <param name="nameValue"></param>
/// <returns></returns>
public SqliteDataReader SelectDataAndName(string tableName, string timeKey, string startTime, string finishTime,string nameKey,string nameValue)
{
string query = "SELECT * FROM " + tableName + " WHERE " + timeKey + " BETWEEN " +$"'{startTime}'" + " AND " + $"'{finishTime}'" + " AND " + nameKey + "=" + $"'{nameValue}'";
return ExecuteQuery(query);
}
/// <summary>
/// 根据多个条件查询所有数据
/// </summary>
/// <param name="tableName"></param>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public SqliteDataReader Select(string tableName, string[] key, string[] value)
{
string query = "SELECT *";
query += " FROM " + tableName + " WHERE " + key[0] + "=" + $"'{value[0]}'";
for (int i = 1; i < key.Length; i++)
{
query += " AND " + key[i] + "=" + $"'{value[i]}'";
}
return ExecuteQuery(query);
}
}