///*************************************************************************/ ///* ///* 文件名 :GenerateSqlCmdBase.cs ///* ///* 程序说明 : SQL命令生成器基类 ///* 原创作者 :孙中吕 ///* ///* Copyright 2006-2021 C/S框架网 www.csframework.com ///* ///**************************************************************************/ using CSFrameworkV5.Core.Common; using System; using System.Collections; using System.Data; using System.Data.Common; using System.Text; namespace CSFrameworkV5.Core.CodeGenerator { /// /// 当SQL命令生成器生成代码后触发的事件 /// /// 已生成插入记录的SQL /// 已生成删除记录的SQL /// 已生成更新记录的SQL public delegate void GeneratedSQLEventHandle(string insertSQL, string deleteSQL, string updateSQL); /// /// SQL命令生成器基类 /// public class GenerateSqlCmdBase : IGenerateSqlCommand { protected ICommandFactory _Factory; public GenerateSqlCmdBase(ICommandFactory factory) { _Factory = factory; } //Insert SQL语句 protected string _sqlInsert = string.Empty; //Update SQL语句 protected string _sqlUpdate = string.Empty; //Delete SQL语句 protected string _sqlDelete = string.Empty; //Insert SQL命令 protected DbCommand _cmdInsert = null; //Update SQL命令 protected DbCommand _cmdUpdate = null; //Delete SQL命令 protected DbCommand _cmdDelete = null; /// /// 单号字段名 /// protected string _DocNoFieldName = string.Empty; /// /// 主键字段名,复合主键用分号";"分开. /// protected string _PrimaryFieldName = string.Empty; /// /// 外键字段名,复合外键用分号";"分开. /// protected string _ForeignFieldName = string.Empty; /// /// 是否主表 /// protected bool _IsSummary = true; /// /// 是否使用并发功能的表 /// /// public bool IsConcurrentTable() { return _ConcurrentAttribute != null; } protected ORM_ConcurrentAttribute _ConcurrentAttribute = null; /// /// 获取单号字段名 /// /// public string GetDocNoFieldName() { return _DocNoFieldName; } /// /// 获取主键字段名 /// /// public string GetPrimaryFieldName() { return _PrimaryFieldName; } /// /// 获取外键字段名 /// /// public string GetForeignFieldName() { return _ForeignFieldName; } /// /// 是否主表 /// /// public bool IsSummary() { return _IsSummary; } /// /// 生成插入记录的SQL命令 /// /// 事务 /// public DbCommand GetInsertCommand(DbTransaction tran) { _cmdInsert.CommandText = CodeSafeHelper.GetSafeSQL(_sqlInsert); _cmdInsert.Connection = tran.Connection; _cmdInsert.Transaction = tran; return _cmdInsert; } /// /// 生成更新记录的SQL命令 /// /// /// public DbCommand GetUpdateCommand(DbTransaction tran) { _cmdUpdate.CommandText = CodeSafeHelper.GetSafeSQL(_sqlUpdate); _cmdUpdate.Connection = tran.Connection; _cmdUpdate.Transaction = tran; return _cmdUpdate; } /// /// 生成删除记录的SQL命令 /// /// /// public DbCommand GetDeleteCommand(DbTransaction tran) { _cmdDelete.CommandText = CodeSafeHelper.GetSafeSQL(_sqlDelete); _cmdDelete.Connection = tran.Connection; _cmdDelete.Transaction = tran; return _cmdDelete; } #region 生成SQL语句 /// /// 生成插入记录用SQL语句 /// /// 表名 /// 主键 /// 字段列表 /// public string GenerateInsertSql(string tableName, string keyName, IList fields) { try { var sb = new StringBuilder(); sb.Append("INSERT INTO " + tableName + " ( "); foreach (ColumnProperty colProper in fields) if (fields.IndexOf(colProper) < fields.Count - 1) sb.Append(colProper.ColumnName + ","); else sb.Append(colProper.ColumnName); sb.Append(" ) VALUES ( "); foreach (ColumnProperty colProper in fields) if (fields.IndexOf(colProper) < fields.Count - 1) sb.Append(_Factory.ParamSymboName + colProper.ColumnName + ","); else sb.Append( _Factory.ParamSymboName + colProper.ColumnName); sb.Append(" )"); return sb.ToStringEx(); } catch { return string.Empty; } } /// /// 生成更新记录用SQL语句 /// /// 表名 /// 主键 /// 字段列表 /// public string GenerateUpdateSql(string tableName, string keyName, IList fields) { //生成SQL格式(标准):UPDATE TABLE_NAME SET F1=@F1 WHERE KEY=@KEY //生成SQL格式(控制并发):UPDATE TABLE_NAME SET F1=@F1 WHERE KEY=@KEY AND TS=@TS //生成SQL格式(复合主键):UPDATE TABLE_NAME SET F1=@F1 WHERE KEY1=@KEY1 AND KEY2=@KEY2 try { var isConcurrent = false; var sb = new StringBuilder(); sb.Append("UPDATE " + tableName + " SET "); foreach (ColumnProperty colProper in fields) { //是否并发字段 isConcurrent = IsConcurrentTable() && _ConcurrentAttribute.TimestampFieldName == colProper.ColumnName; //主键及并发字段不拼接SQL脚本 if (colProper.IsPrimaryKey || isConcurrent) continue; if (fields.IndexOf(colProper) == fields.Count - 1) //最后一个参数 sb.Append(colProper.ColumnName + "=" + _Factory.ParamSymboName + colProper.ColumnName); else sb.Append(colProper.ColumnName + "=" + _Factory.ParamSymboName + colProper.ColumnName + ","); } //删除最后面多余的调号 sb = new StringBuilder(sb.ToStringEx().TrimEnd(',')); //添加Where条件:记录主键 sb.Append(" WHERE 1=1 " + SplitKeyName(keyName)); //主键 //添加并发字段的WHERE 条件 if (IsConcurrentTable()) sb.Append(" AND " + GetConncurrentKeyName()); //并发 return sb.ToStringEx(); } catch { return string.Empty; } } /// /// 生成删除记录用SQL语句 /// /// 表名 /// 主键 /// 字段列表 /// public string GenerateDeleteSql(string tableName, string keyName) { try { var sb = new StringBuilder(); sb.Append("DELETE FROM " + tableName + " WHERE 1=1 " + SplitKeyName(keyName)); //复合主键处理 return sb.ToStringEx(); } catch { return string.Empty; } } #endregion /// /// 复合主键处理 /// /// 字段名,多个字段用分号分开 /// protected virtual string SplitKeyName(string keyName) { var strBuilder = new StringBuilder(); var arrayStr = keyName.Split(';'); foreach (var tempKeyName in arrayStr) { if (tempKeyName == "") continue; strBuilder.Append(" AND " + tempKeyName + "=" + _Factory.ParamSymboName + tempKeyName); } return strBuilder.ToStringEx(); } /// /// 取并发操作的字段名 /// /// protected virtual string GetConncurrentKeyName() { if (IsConcurrentTable()) return _ConcurrentAttribute.TimestampFieldName + "=" + _Factory.ParamSymboName + _ConcurrentAttribute.TimestampFieldName; else return ""; } } }