using System.Data; using Microsoft.Data.Sqlite; using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Model; namespace Milimoe.FunGame.Server.Utility.DataUtility { public class SQLiteHelper : SQLHelper { public override FunGameInfo.FunGame FunGameType { get; } = FunGameInfo.FunGame.FunGame_Server; public override SQLMode Mode { get; } = SQLMode.SQLite; public override string Script { get; set; } = ""; public override CommandType CommandType { get; set; } = CommandType.Text; public override SQLResult Result => _result; public override SQLServerInfo ServerInfo => _serverInfo ?? SQLServerInfo.Create(); public override int UpdateRows => _updateRows; public override DataSet DataSet => _dataSet; private readonly SqliteConnection _connection; private SqliteTransaction? _transaction; private DataSet _dataSet = new(); private SQLResult _result = SQLResult.NotFound; private readonly SQLServerInfo? _serverInfo; private int _updateRows = 0; private readonly string _connectionString = ""; public SQLiteHelper(string script = "", CommandType type = CommandType.Text) { Script = script; CommandType = type; _connectionString = ConnectProperties.GetConnectPropertiesForSQLite(); string[] strings = _connectionString.Split("="); if (strings.Length > 1) { ServerHelper.WriteLine("Connect -> SQLite://" + strings[1]); _serverInfo = SQLServerInfo.Create(database: strings[1]); } _connection = new SqliteConnection(_connectionString); } /// /// 打开数据库连接 /// private void OpenConnection() { if (_connection.State != ConnectionState.Open) { _connection.Open(); } } /// /// 关闭数据库连接 /// public override void Close() { _transaction?.Dispose(); if (_connection.State != ConnectionState.Closed) { _connection.Close(); } } /// /// 执行一个命令 /// /// public override int Execute() { return Execute(Script); } /// /// 执行一个指定的命令 /// /// /// /// public override int Execute(string script) { try { OpenConnection(); ServerHelper.WriteLine("SQLQuery -> " + script, InvokeMessageType.Api); using SqliteCommand command = new(script, _connection); command.CommandType = CommandType; if (_transaction != null) { command.Transaction = _transaction; } _updateRows = command.ExecuteNonQuery(); _result = SQLResult.Success; Close(); return UpdateRows; } catch (Exception ex) { _result = SQLResult.Fail; throw new Exception($"SQL execution failed: {ex.Message}", ex); } } /// /// 查询DataSet /// /// public override DataSet ExecuteDataSet() { return ExecuteDataSet(Script); } /// /// 执行指定的命令查询DataSet /// /// /// /// public override DataSet ExecuteDataSet(string script) { try { OpenConnection(); ServerHelper.WriteLine("SQLQuery -> " + script, InvokeMessageType.Api); using SqliteCommand command = new(script, _connection) { CommandType = CommandType }; using SqliteDataReader reader = command.ExecuteReader(); _dataSet = new(); DataTable table = new(); table.Load(reader); _dataSet.Tables.Add(table); Close(); return _dataSet; } catch (Exception ex) { _result = SQLResult.Fail; throw new Exception($"SQL execution failed: {ex.Message}", ex); } } /// /// 执行指定的命令查询DataRow /// /// public override DataRow? ExecuteDataRow() { return ExecuteDataRow(Script); } /// /// 执行指定的命令查询DataRow /// /// /// public override DataRow? ExecuteDataRow(string script) { OpenConnection(); ServerHelper.WriteLine("SQLQuery -> " + script, InvokeMessageType.Api); DataSet dataSet = ExecuteDataSet(script); if (dataSet.Tables.Count > 0 && dataSet.Tables[0].Rows.Count > 0) { Close(); return dataSet.Tables[0].Rows[0]; } Close(); return null; } /// /// 创建一个SQL事务 /// public override void NewTransaction() { OpenConnection(); _transaction = _connection.BeginTransaction(); } /// /// 提交事务 /// /// public override void Commit() { try { _transaction?.Commit(); Close(); _result = SQLResult.Success; } catch (Exception ex) { _result = SQLResult.Fail; throw new Exception($"Transaction commit failed: {ex.Message}", ex); } } /// /// 回滚事务 /// /// public override void Rollback() { try { _transaction?.Rollback(); Close(); _result = SQLResult.Success; } catch (Exception ex) { _result = SQLResult.Fail; throw new Exception($"Transaction rollback failed: {ex.Message}", ex); } } /// /// 资源清理 /// public void Dispose() { _transaction?.Dispose(); _connection.Dispose(); } } }