From b87f54fe16895b598757322fad104c59799dfffe Mon Sep 17 00:00:00 2001 From: milimoe <110188673+milimoe@users.noreply.github.com> Date: Sat, 29 Mar 2025 01:01:20 +0800 Subject: [PATCH] =?UTF-8?q?SQLHelper=20=E6=B7=BB=E5=8A=A0=E4=BA=8B?= =?UTF-8?q?=E5=8A=A1=E5=B1=9E=E6=80=A7=E3=80=81=E6=9C=80=E5=90=8E=E7=9A=84?= =?UTF-8?q?=E8=87=AA=E5=A2=9EID=E3=80=81=E5=BC=82=E6=AD=A5=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84=E6=89=A7=E8=A1=8C=E6=96=B9=E6=B3=95=20(#121)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Api/Transmittal/SQLHelper.cs | 148 ++++++++++++++++++++++++++++++++--- Interface/Base/ISQLHelper.cs | 8 +- 2 files changed, 145 insertions(+), 11 deletions(-) diff --git a/Api/Transmittal/SQLHelper.cs b/Api/Transmittal/SQLHelper.cs index 1ec2ad5..33dde77 100644 --- a/Api/Transmittal/SQLHelper.cs +++ b/Api/Transmittal/SQLHelper.cs @@ -1,4 +1,5 @@ using System.Data; +using System.Data.Common; using Milimoe.FunGame.Core.Interface.Base; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Model; @@ -6,24 +7,77 @@ using Milimoe.FunGame.Core.Model; namespace Milimoe.FunGame.Core.Api.Transmittal { /// - /// 需要在Server中继承此类实现 + /// 数据库助手类。这是一个抽象类,需要在Server中继承此类实现 /// public abstract class SQLHelper : ISQLHelper, IDisposable { + /// + /// FunGame 类型 + /// public abstract FunGameInfo.FunGame FunGameType { get; } + + /// + /// 使用的数据库类型 + /// public abstract SQLMode Mode { get; } + + /// + /// SQL 脚本 + /// public abstract string Script { get; set; } + + /// + /// 命令类型 + /// public abstract CommandType CommandType { get; set; } + + /// + /// 数据库事务 + /// + public abstract DbTransaction? Transaction { get; } + + /// + /// 执行结果 + /// public abstract SQLResult Result { get; } + + /// + /// SQL 服务器信息 + /// public abstract SQLServerInfo ServerInfo { get; } - public abstract int UpdateRows { get; } + + /// + /// 上一次执行命令影响的行数 + /// + public abstract int AffectedRows { get; } + + /// + /// 上一次执行的命令是 Insert 时,返回的自增 ID,大于 0 有效 + /// + public abstract long LastInsertId { get; } + + /// + /// 上一次执行命令的查询结果集 + /// public abstract DataSet DataSet { get; } + + /// + /// SQL 语句参数 + /// public abstract Dictionary Parameters { get; } + + /// + /// 上一次执行命令是否成功 + /// public bool Success => Result == SQLResult.Success; + + /// + /// 是否在每次执行命令后清除参数,默认为 true + /// public bool ClearParametersAfterExecute { get; set; } = true; /// - /// 执行一个命令 + /// 执行现有命令() /// /// 影响的行数 public abstract int Execute(); @@ -36,20 +90,46 @@ namespace Milimoe.FunGame.Core.Api.Transmittal public abstract int Execute(string script); /// - /// 查询DataSet + /// 异步执行现有命令() + /// + /// 影响的行数 + public abstract Task ExecuteAsync(); + + /// + /// 异步执行一个指定的命令 + /// + /// 命令 + /// 影响的行数 + public abstract Task ExecuteAsync(string script); + + /// + /// 执行现有命令()查询 DataSet /// /// 结果集 public abstract DataSet ExecuteDataSet(); /// - /// 执行指定的命令查询DataSet + /// 执行指定的命令查询 DataSet /// /// 命令 /// 结果集 public abstract DataSet ExecuteDataSet(string script); /// - /// 执行指定的命令查询DataRow(可选实现) + /// 异步执行现有命令()查询 DataSet + /// + /// 结果集 + public abstract Task ExecuteDataSetAsync(); + + /// + /// 异步执行指定的命令查询 DataSet + /// + /// 命令 + /// 结果集 + public abstract Task ExecuteDataSetAsync(string script); + + /// + /// 执行现有命令()查询 DataRow(可选实现) /// /// 结果行 public virtual DataRow? ExecuteDataRow() @@ -58,16 +138,40 @@ namespace Milimoe.FunGame.Core.Api.Transmittal } /// - /// 执行指定的命令查询DataRow(可选实现) + /// 执行指定的命令查询 DataRow(可选实现) /// /// 命令 /// 结果行 public virtual DataRow? ExecuteDataRow(string script) { - DataSet dataSet = ExecuteDataSet(script); - if (dataSet.Tables.Count > 0 && dataSet.Tables[0].Rows.Count > 0) + ExecuteDataSet(script); + if (Success) { - return dataSet.Tables[0].Rows[0]; + return DataSet.Tables[0].Rows[0]; + } + return null; + } + + /// + /// 异步执行现有命令()查询 DataRow(可选实现) + /// + /// 结果行 + public virtual async Task ExecuteDataRowAsync() + { + return await ExecuteDataRowAsync(Script); + } + + /// + /// 异步执行指定的命令查询 DataRow(可选实现) + /// + /// 命令 + /// 结果行 + public virtual async Task ExecuteDataRowAsync(string script) + { + await ExecuteDataSetAsync(script); + if (Success) + { + return DataSet.Tables[0].Rows[0]; } return null; } @@ -101,6 +205,30 @@ namespace Milimoe.FunGame.Core.Api.Transmittal } } } + + /// + /// 异步执行一个 sql 脚本文件 + /// + /// + public virtual async Task ExecuteSqlFileAsync(string path) + { + if (!File.Exists(path)) + { + throw new FileNotFoundException("SQL 脚本文件不存在", path); + } + + string content = File.ReadAllText(path); + string[] commands = content.Split([";"], StringSplitOptions.RemoveEmptyEntries); + + foreach (string command in commands) + { + string sql = command.Trim(); + if (!string.IsNullOrEmpty(sql)) + { + await ExecuteAsync(sql); + } + } + } /// /// 关闭连接 diff --git a/Interface/Base/ISQLHelper.cs b/Interface/Base/ISQLHelper.cs index 7a2dec1..ceeb3cd 100644 --- a/Interface/Base/ISQLHelper.cs +++ b/Interface/Base/ISQLHelper.cs @@ -1,4 +1,5 @@ using System.Data; +using System.Data.Common; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Model; @@ -9,15 +10,20 @@ namespace Milimoe.FunGame.Core.Interface.Base public FunGameInfo.FunGame FunGameType { get; } public string Script { get; set; } public CommandType CommandType { get; set; } + public DbTransaction? Transaction { get; } public SQLResult Result { get; } public SQLServerInfo ServerInfo { get; } - public int UpdateRows { get; } + public int AffectedRows { get; } + public long LastInsertId { get; } public DataSet DataSet { get; } public bool Success { get; } public int Execute(); public DataSet ExecuteDataSet(); public DataRow? ExecuteDataRow(); + public Task ExecuteAsync(); + public Task ExecuteDataSetAsync(); + public Task ExecuteDataRowAsync(); public void Close(); public void NewTransaction(); public void Commit();