#region
|
|
using System;
|
using System.Data;
|
using System.Data.Common;
|
using System.Text;
|
using CSFramework.DB;
|
using CSFrameworkV5.Core;
|
|
#endregion
|
|
namespace CSFrameworkV5.DataAccess
|
{
|
/// <summary>
|
/// 数据访问层基类定义
|
/// </summary>
|
public class dalBase
|
{
|
/// <summary>
|
/// 当前正在更新的数据集,调用Update方法时系统变量赋值
|
/// </summary>
|
protected DataSet _CurrentDataSet4Update = null;
|
|
/// <summary>
|
/// 当前正在更新的数据表,调用Update方法时系统变量赋值
|
/// </summary>
|
protected DataTable _CurrentTable4Update = null;
|
|
protected IDatabase _Database;
|
|
/// <summary>
|
/// 是否生成带参数的SQL脚本,用于开发环境的调试。true:在调用DAL.Update方法时生成SQL脚本。
|
/// </summary>
|
protected bool _GenerateLastRowSQLText = false;
|
|
/// <summary>
|
/// 最后一次提交数据时生成的SQL脚本,用于开发环境的调试
|
/// </summary>
|
protected string _LastRowSQLText = "";
|
|
/// <summary>
|
/// 当前登录的用户信息
|
/// </summary>
|
protected Loginer _Loginer;
|
|
/// <summary>
|
/// 生成流水号码的类型(有规则流水号或GUID)
|
/// </summary>
|
protected UpdateKeyMode _UpdateSummaryKeyMode = UpdateKeyMode.None;
|
|
/// <summary>
|
/// 设置为受保护的构造器,不允许外部实例化
|
/// </summary>
|
/// <param name="loginer">当前登录的用户</param>
|
protected dalBase(Loginer loginer)
|
{
|
if (loginer != null)
|
{
|
_Loginer = loginer;
|
|
//若登录信息包含帐套编号,实例化该帐套对应的数据库连接
|
if (!string.IsNullOrEmpty(loginer.DBID))
|
_Database = DatabaseProvider.GetDatabase(loginer.DBID);
|
}
|
}
|
|
/// <summary>
|
/// 建立连接的数据库(预设为当前账套对应的数据库)
|
/// </summary>
|
public IDatabase Database
|
{
|
get => _Database;
|
set => _Database = value;
|
}
|
|
/// <summary>
|
/// SQL命令生成器的对象工厂
|
/// </summary>
|
/// <returns></returns>
|
protected ICommandFactory GeneratorFactory =>
|
new SqlGeneratorFactory(_Database);
|
|
/// <summary>
|
/// 适配器提交记录时触发的事件
|
/// </summary>
|
public virtual void AdapterRowUpdatingEvent(object sender,
|
RowUpdatingEventArgs arg)
|
{
|
//生成SQL脚本
|
if (_GenerateLastRowSQLText)
|
_LastRowSQLText = BuildSQLText(arg.Command.Parameters);
|
|
//日期数据是DateTime.MinValue,需要转换为DBNull.Value
|
FixDateTime(arg.Command.Parameters);
|
}
|
|
/// <summary>
|
/// 生成带参数的SQL脚本
|
/// </summary>
|
/// <param name="parameters">DbCommand参数</param>
|
/// <returns></returns>
|
private string BuildSQLText(IDataParameterCollection parameters)
|
{
|
var sb = new StringBuilder();
|
foreach (DbParameter p in parameters)
|
sb.AppendLine(p.ParameterName + "=" +
|
(p.Value == null || p.Value == DBNull.Value ||
|
p.Value.ToStringEx() == ""
|
? "null"
|
: p.Value.ToStringEx()) + ", ");
|
|
return sb.ToStringEx();
|
}
|
|
/// <summary>
|
/// 将字段值为DateTime.MinValue转换为DBNULL
|
/// </summary>
|
/// <param name="parameters"></param>
|
private void FixDateTime(IDataParameterCollection parameters)
|
{
|
foreach (DbParameter p in parameters)
|
{
|
if (p.DbType != DbType.DateTime ||
|
p.DbType != DbType.DateTime2 ||
|
p.DbType != DbType.Time) continue;
|
|
if (p.Value == DBNull.Value || p.Value == null) continue;
|
|
//日期数据是DateTime.MinValue,需要转换为DBNull.Value;
|
if (DateTime.Parse(p.Value.ToStringEx()).ToString("yyyyMMdd") ==
|
DateTime.MinValue.ToString("yyyyMMdd"))
|
p.Value = DBNull.Value;
|
}
|
}
|
|
#region 事务控制
|
|
/// <summary>
|
/// true表示手工启用事务控制,预设为false,表示平台自动启动是事务。
|
/// </summary>
|
protected bool _UserManualControlTrans = false;
|
|
/// <summary>
|
/// 当前事务
|
/// </summary>
|
protected DbTransaction _CurrentTrans;
|
|
/// <summary>
|
/// 当前事务的数据库连接
|
/// </summary>
|
protected DbConnection _CurrentConnection;
|
|
/// <summary>
|
/// 启用事务控制
|
/// </summary>
|
protected virtual void BeginTransaction()
|
{
|
_CurrentConnection = _Database.CreateConnection();
|
_CurrentTrans = _CurrentConnection.BeginTransaction();
|
}
|
|
/// <summary>
|
/// 提交事务
|
/// </summary>
|
protected virtual void CommitTransaction()
|
{
|
try
|
{
|
if (_CurrentTrans != null)
|
{
|
_CurrentTrans.Commit();
|
_CurrentTrans = null;
|
_Database.Close(_CurrentConnection);
|
}
|
}
|
catch
|
{
|
_Database.Close(_CurrentConnection);
|
throw;
|
}
|
}
|
|
/// <summary>
|
/// 回滚事务
|
/// </summary>
|
protected virtual void RollbackTransaction()
|
{
|
try
|
{
|
if (_CurrentTrans != null)
|
{
|
_CurrentTrans.Rollback();
|
_CurrentTrans = null;
|
_Database.Close(_CurrentConnection);
|
}
|
}
|
catch
|
{
|
_Database.Close(_CurrentConnection);
|
throw;
|
}
|
}
|
|
#endregion
|
}
|
}
|