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