using System.Data; using System.Data.Common; using Milimoe.FunGame.Core.Interface.Base; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Model; namespace Milimoe.FunGame.Core.Api.Transmittal { /// /// 数据库助手类。这是一个抽象类,需要在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 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(); /// /// 执行一个指定的命令 /// /// 命令 /// 影响的行数 public abstract int Execute(string script); /// /// 异步执行现有命令() /// /// 影响的行数 public abstract Task ExecuteAsync(); /// /// 异步执行一个指定的命令 /// /// 命令 /// 影响的行数 public abstract Task ExecuteAsync(string script); /// /// 执行现有命令()查询 DataSet /// /// 结果集 public abstract DataSet ExecuteDataSet(); /// /// 执行指定的命令查询 DataSet /// /// 命令 /// 结果集 public abstract DataSet ExecuteDataSet(string script); /// /// 异步执行现有命令()查询 DataSet /// /// 结果集 public abstract Task ExecuteDataSetAsync(); /// /// 异步执行指定的命令查询 DataSet /// /// 命令 /// 结果集 public abstract Task ExecuteDataSetAsync(string script); /// /// 执行现有命令()查询 DataRow(可选实现) /// /// 结果行 public virtual DataRow? ExecuteDataRow() { return ExecuteDataRow(Script); } /// /// 执行指定的命令查询 DataRow(可选实现) /// /// 命令 /// 结果行 public virtual DataRow? ExecuteDataRow(string script) { ExecuteDataSet(script); if (Success) { 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; } /// /// 查询数据库是否存在 /// /// public abstract bool DatabaseExists(); /// /// 执行一个 sql 脚本文件 /// /// public virtual void ExecuteSqlFile(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)) { Execute(sql); } } } /// /// 异步执行一个 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); } } } /// /// 关闭连接 /// public abstract void Close(); /// /// 创建一个SQL事务 /// public abstract void NewTransaction(); /// /// 提交事务 /// public abstract void Commit(); /// /// 回滚事务 /// public abstract void Rollback(); /// /// 释放资源 /// public abstract void Dispose(); } }