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();