///*************************************************************************/
///*
///* 文件名 :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 "";
}
}
}