You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

807 lines
29 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.Serialization;
using System.Text;
using HcUtility.Comm;
namespace HcUtility.Core
{
/// <summary>
/// 功能: ModelObject的基类
/// 创建: 吴伟 2009-05-07
/// 说明:
/// </summary>
[DataContract]
public class ModelObjectBase_Base : IModelObject
{
#region 公共属性
//存储此数据的对应的数据表名
public string TableName { get; set; }
//明细数据
public List<List<ModelObjectBase>> BodyList
{
get { return _bodyList; }
set { _bodyList = value; }
}
//保存时的动作(如新增、修改等)
public DbOperationType DbOperationType
{
get { return _dbOperationType; }
set { _dbOperationType = value; }
}
public virtual string getSQL()
{
//在实际实体类中实现,为实体类确定查询语句。
return "";
}
#endregion
/// <summary>
/// 功能: 根据属性指定的ModelDBAttribute[]反射取得Insert SQL语句
/// 创建: 吴伟 2009-05-07
/// 说明: 子类可以覆盖此方法,生成自己的Insert语句
/// </summary>
/// <returns>Insert Sql语句 </returns>
public virtual string GenInsertSql()
{
var sbInto = new StringBuilder();
var sbParam = new StringBuilder();
var sbSql = new StringBuilder();
string insertSql = String.Empty;
string fieldName = String.Empty;
string paramName = string.Empty;
PropertyDescriptorCollection pdcList = TypeDescriptor.GetProperties(this);
foreach (PropertyDescriptor pdc in pdcList)
{
foreach (Attribute attr in pdc.Attributes)
{
if (attr is ModelDBAttribute)
{
var a = (ModelDBAttribute) attr;
if (ModelDBOprationType.Insert == (ModelDBOprationType.Insert & a.MDBType))
{
if (sbInto.Length != 0)
{
sbInto.Append(",");
sbParam.Append(",");
}
fieldName = a.InsFieldName == String.Empty ? pdc.Name : a.InsFieldName;
paramName = a.InsParamName == String.Empty ? pdc.Name : a.InsParamName;
sbInto.Append("["+fieldName+"]"); //如果属性设置了FieldName值则取设置的FieldName值否则取属性值
sbParam.Append("@" + paramName); //如果属性设置了ParamName值则取设置的ParamName值否则取属性值
}
}
}
}
sbSql.Append("Insert Into " + TableName);
sbSql.Append(" (");
sbSql.Append(sbInto.ToString());
sbSql.Append(" ) ");
sbSql.Append(" Values");
sbSql.Append(" (");
sbSql.Append(sbParam.ToString());
sbSql.Append(" ) ");
return sbSql.ToString();
}
/// <summary>
/// 功能: 根据属性指定的ModelDBAttribute[]反射取得Update SQL语句
/// 创建: 吴伟 2009-05-07
/// 说明: 子类可以覆盖此方法,生成自己的Update语句
/// </summary>
/// <returns>Update Sql语句 </returns>
public virtual string GenUpdateSql()
{
var sbUpdAndParam = new StringBuilder();
var sbWhere = new StringBuilder();
var sbSql = new StringBuilder();
string insertSql = String.Empty;
string fieldName = String.Empty;
string paramName = String.Empty;
PropertyDescriptorCollection pdcList = TypeDescriptor.GetProperties(this);
foreach (PropertyDescriptor pdc in pdcList)
{
foreach (Attribute attr in pdc.Attributes)
{
if (attr is ModelDBAttribute)
{
var a = (ModelDBAttribute) attr;
if (ModelDBOprationType.Edit == (ModelDBOprationType.Edit & a.MDBType))
{
fieldName = a.UpdFieldName == String.Empty ? pdc.Name : a.UpdFieldName;
paramName = a.UpdParamName == String.Empty ? pdc.Name : a.UpdParamName;
if (!a.IsPrimary)
{
if (sbUpdAndParam.Length != 0)
{
sbUpdAndParam.Append(",");
}
sbUpdAndParam.Append("["+fieldName+"]" + "=@" + paramName);
}
if (a.IsPrimary)
{
if (sbWhere.Length != 0)
{
sbWhere.Append(" and ");
}
sbWhere.Append("[" + fieldName + "]" + "=@" + paramName);
}
}
}
}
}
sbSql.Append("update " + TableName);
sbSql.Append(" set ");
sbSql.Append(sbUpdAndParam.ToString());
sbSql.Append(" where ");
sbSql.Append(sbWhere.ToString());
//后台sql执行语句
return sbSql.ToString();
}
/// <summary>
/// 功能: 根据属性指定的ModelDBAttribute[]反射取得Delete SQL语句
/// 创建: 吴伟 2009-05-07
/// 说明: 子类可以覆盖此方法,生成自己的Delete语句
/// </summary>
/// <returns>Delete Sql语句 </returns>
public virtual string GenDeleteSql()
{
var sbUpdAndParam = new StringBuilder();
var sbWhere = new StringBuilder();
var sbSql = new StringBuilder();
string insertSql = String.Empty;
string fieldName = String.Empty;
string paramName = String.Empty;
PropertyDescriptorCollection pdcList = TypeDescriptor.GetProperties(this);
foreach (PropertyDescriptor pdc in pdcList)
{
foreach (Attribute attr in pdc.Attributes)
{
if (attr is ModelDBAttribute)
{
var a = (ModelDBAttribute) attr;
if (ModelDBOprationType.Delete == (ModelDBOprationType.Delete & a.MDBType))
{
fieldName = a.DelFieldName == String.Empty ? pdc.Name : a.DelFieldName;
paramName = a.DelParamName == String.Empty ? pdc.Name : a.DelParamName;
if (sbWhere.Length != 0)
{
sbWhere.Append(" and ");
}
sbWhere.Append(fieldName + "=@" + paramName);
}
}
}
}
if (sbWhere.ToString() == String.Empty)
{
throw new NotSupportedException("请增加Model的属性已组成条件");
}
sbSql.Append(" delete from " + TableName);
sbSql.Append(" where ");
sbSql.Append(sbWhere.ToString());
return sbSql.ToString();
}
public virtual string GenDeleteSql(string USERID)
{
var sbUpdAndParam = new StringBuilder();
var sbWhere = new StringBuilder();
var sbSql = new StringBuilder();
string insertSql = String.Empty;
string fieldName = String.Empty;
string paramName = String.Empty;
PropertyDescriptorCollection pdcList = TypeDescriptor.GetProperties(this);
foreach (PropertyDescriptor pdc in pdcList)
{
foreach (Attribute attr in pdc.Attributes)
{
if (attr is ModelDBAttribute)
{
var a = (ModelDBAttribute)attr;
if (ModelDBOprationType.Delete == (ModelDBOprationType.Delete & a.MDBType))
{
fieldName = a.DelFieldName == String.Empty ? pdc.Name : a.DelFieldName;
paramName = a.DelParamName == String.Empty ? pdc.Name : a.DelParamName;
if (sbWhere.Length != 0)
{
sbWhere.Append(" and ");
}
sbWhere.Append(fieldName + "=@" + paramName);
}
}
}
}
if (sbWhere.ToString() == String.Empty)
{
throw new NotSupportedException("请增加Model的属性已组成条件");
}
sbSql.Append(" update " + TableName + " set ISDELETE=1,DELETETIME=getdate(),DELETEUSER='" + USERID + "'");
sbSql.Append(" where ");
sbSql.Append(sbWhere.ToString());
return sbSql.ToString();
}
//public virtual string GenSelectSql()
//{
// var sbSelect = new StringBuilder();
// PropertyDescriptorCollection pdcList = TypeDescriptor.GetProperties(this);
// foreach (PropertyDescriptor pdc in pdcList)
// {
// foreach (Attribute attr in pdc.Attributes)
// {
// if (attr is ModelDBAttribute)
// {
// var a = (ModelDBAttribute)attr;
// if (ModelDBOprationType.Select == (ModelDBOprationType.Select & a.MDBType))
// {
// if (sbSelect.Length != 0)
// {
// sbSelect.Append(",");
// }
// var fieldName = a.InsFieldName == String.Empty ? pdc.Name : a.InsFieldName;
// sbSelect.Append(fieldName); //如果属性设置了FieldName值则取设置的FieldName值否则取属性值
// }
// }
// }
// }
// var sbSql = new StringBuilder();
// sbSql.Append(" select ");
// sbSql.Append(sbSelect.ToString());
// sbSql.Append(" from " + TableName);
// return sbSql.ToString();
//}
#region 私有/保护变量
protected List<List<ModelObjectBase>> _bodyList = new List<List<ModelObjectBase>>();
protected DbOperationType _dbOperationType;
#endregion
}
public class ExtendData : Object
{
public string Name { get; set; }
public string Value { get; set; }
public ModelDBAttribute MDB { get; set; }
public ExtendData(string Name, string Value, ModelDBAttribute ma)
{
this.Name = Name;
this.Value = Value;
this.MDB = ma;
}
}
/// <summary>
/// 包含扩展数据类型的新基类 兼容原有功能
/// </summary>
public class ModelObjectBase : ModelObjectBase_Base
{
#region
protected List<ExtendData> _ExtendList = new List<ExtendData>();
public List<ExtendData> ExtendDataList
{
get { return _ExtendList; }
set { _ExtendList = value; }
}
public bool Extended()
{
if (_ExtendList.Count > 0)
{
return true;
}
return false;
}
protected Dictionary<string, string> _SaveDic = new Dictionary<string, string>();
public Dictionary<string, string> SaveDic
{
get { return _SaveDic; }
set { _SaveDic = value; }
}
public bool CanSave(string Name)
{
if (SaveDic.ContainsKey(Name))
{
if (SaveDic[Name] == "1") return true;
}
return false;
}
public void NoSave(string Name)
{
if (SaveDic.ContainsKey(Name))
{
SaveDic[Name] = "0";
}
}
public void LetSave(string Name)
{
if (SaveDic.ContainsKey(Name))
{
SaveDic[Name] = "1";
}
}
public void TimeNext()
{
//
}
public Dictionary<string, string> ExtendDic
{
get
{
var result = new Dictionary<string, string>();
if (Extended())
{
foreach (var d in ExtendDataList)
{
result.Add(d.Name, d.Value);
}
}
return result;
}
}
public bool Have(string name)
{
if (ExtendDataList.Find(x => x.Name == name) == null)
{
return false;
}
else
{
return true;
}
}
virtual public Dictionary<string, ModelDBOprationType> GetPKey()
{//用于给扩展的动态数据提供主键字段名
var d = new Dictionary<string, ModelDBOprationType>() { { "ID", ModelDBOprationType.EditDelete }, { "GID", ModelDBOprationType.All } };
return d;
}
/// <summary>
/// 添加扩展参数
/// </summary>
/// <param name="Name"></param>
/// <param name="Value"></param>
/// <param name="ma"></param>
private void AddExtendDate(string Name, string Value, ModelDBAttribute ma)
{
var ed = new ExtendData(Name, Value, ma);
ExtendDataList.Add(ed);
}
/// <summary>
/// 添加扩展参数 只增加普通类型(即可保存 非insert delete主键
/// </summary>
/// <param name="Name"></param>
/// <param name="Value"></param>
public void AddExtendDate(string Name, string Value)
{
ModelDBAttribute ma = new ModelDBAttribute();
ma.IsPrimary = false;
var _dt = GetPKey();
if (_dt.ContainsKey(Name))
{
if ((_dt[Name] & ModelDBOprationType.All) > 0)
{
AddExtendDate(Name, Value, true, _dt[Name]);
}
}
else
{
if (CanSave(Name))
{
ma.MDBType = ModelDBOprationType.InsertEdit;
}
else
{
ma.MDBType = 0;
}
var ed = new ExtendData(Name, Value, ma);
ExtendDataList.Add(ed);
}
}
public void AddExtendDate_Show(string Name, string Value)
{
ModelDBAttribute ma = new ModelDBAttribute();
ma.IsPrimary = false;
ma.MDBType = 0;
var ed = new ExtendData(Name, Value, ma);
ExtendDataList.Add(ed);
}
private void AddExtendDate(string Name, string Value, bool IsPrimary, ModelDBOprationType mot)
{
ModelDBAttribute ma = new ModelDBAttribute();
ma.IsPrimary = IsPrimary;
ma.MDBType = mot;
var ed = new ExtendData(Name, Value, ma);
ExtendDataList.Add(ed);
}
#endregion
/// <summary>
/// 功能: 根据属性指定的ModelDBAttribute[]反射取得Insert SQL语句
/// 创建: ddlucky 2017-03-01
/// 说明: 子类可以覆盖此方法,生成自己的Insert语句
/// </summary>
/// <returns>Insert Sql语句 </returns>
public override string GenInsertSql()
{
var sbInto = new StringBuilder();
var sbParam = new StringBuilder();
var sbSql = new StringBuilder();
string insertSql = String.Empty;
string fieldName = String.Empty;
string paramName = string.Empty;
PropertyDescriptorCollection pdcList = TypeDescriptor.GetProperties(this);
foreach (PropertyDescriptor pdc in pdcList)
{
foreach (Attribute attr in pdc.Attributes)
{
if (attr is ModelDBAttribute)
{
var a = (ModelDBAttribute)attr;
if (ModelDBOprationType.Insert == (ModelDBOprationType.Insert & a.MDBType))
{
if (sbInto.Length != 0)
{
sbInto.Append(",");
sbParam.Append(",");
}
fieldName = a.InsFieldName == String.Empty ? pdc.Name : a.InsFieldName;
paramName = a.InsParamName == String.Empty ? pdc.Name : a.InsParamName;
sbInto.Append("[" + fieldName + "]"); //如果属性设置了FieldName值则取设置的FieldName值否则取属性值
sbParam.Append("@" + paramName); //如果属性设置了ParamName值则取设置的ParamName值否则取属性值
}
}
}
}
if (Extended())
{
foreach (var d in ExtendDataList)
{
if (d.MDB.needInsert())
{
if (sbInto.Length != 0)
{
sbInto.Append(",");
sbParam.Append(",");
}
sbInto.Append("[" + d.Name + "]");
sbParam.Append("@" + d.Name);
}
}
}
sbSql.Append("Insert Into " + TableName);
sbSql.Append(" (");
sbSql.Append(sbInto.ToString());
sbSql.Append(" ) ");
sbSql.Append(" Values");
sbSql.Append(" (");
sbSql.Append(sbParam.ToString());
sbSql.Append(" ) ");
return sbSql.ToString();
}
/// <summary>
/// 功能: 根据属性指定的ModelDBAttribute[]反射取得Update SQL语句
/// 创建: ddlucky 2017-03-01
/// 说明: 子类可以覆盖此方法,生成自己的Update语句
/// </summary>
/// <returns>Update Sql语句 </returns>
public override string GenUpdateSql()
{
var sbUpdAndParam = new StringBuilder();
var sbWhere = new StringBuilder();
var sbSql = new StringBuilder();
string insertSql = String.Empty;
string fieldName = String.Empty;
string paramName = String.Empty;
PropertyDescriptorCollection pdcList = TypeDescriptor.GetProperties(this);
foreach (PropertyDescriptor pdc in pdcList)
{
foreach (Attribute attr in pdc.Attributes)
{
if (attr is ModelDBAttribute)
{
var a = (ModelDBAttribute)attr;
if (ModelDBOprationType.Edit == (ModelDBOprationType.Edit & a.MDBType))
{
fieldName = a.UpdFieldName == String.Empty ? pdc.Name : a.UpdFieldName;
paramName = a.UpdParamName == String.Empty ? pdc.Name : a.UpdParamName;
if (!a.IsPrimary)
{
if (sbUpdAndParam.Length != 0)
{
sbUpdAndParam.Append(",");
}
sbUpdAndParam.Append("[" + fieldName + "]" + "=@" + paramName);
}
if (a.IsPrimary)
{
if (sbWhere.Length != 0)
{
sbWhere.Append(" and ");
}
sbWhere.Append("[" + fieldName + "]" + "=@" + paramName);
}
}
}
}
}
if (Extended())
{
foreach (var d in ExtendDataList)
{
if (d.MDB.needInsert())
{
if (sbUpdAndParam.Length != 0)
{
sbUpdAndParam.Append(",");
}
sbUpdAndParam.Append("[" + d.Name + "]" + "=@" + d.Name);
}
if (d.MDB.IsPrimary)
{
if (sbWhere.Length != 0)
{
sbWhere.Append(" and ");
}
sbWhere.Append("[" + d.Name + "]" + "=@" + d.Name);
}
}
}
sbSql.Append("update " + TableName);
sbSql.Append(" set ");
sbSql.Append(sbUpdAndParam.ToString());
sbSql.Append(" where ");
sbSql.Append(sbWhere.ToString());
//后台sql执行语句
return sbSql.ToString();
}
/// <summary>
/// 功能: 根据属性指定的ModelDBAttribute[]反射取得Delete SQL语句
/// 创建: ddlucky 2017-03-01
/// 说明: 子类可以覆盖此方法,生成自己的Delete语句
/// </summary>
/// <returns>Delete Sql语句 </returns>
public override string GenDeleteSql()
{
var sbUpdAndParam = new StringBuilder();
var sbWhere = new StringBuilder();
var sbSql = new StringBuilder();
string insertSql = String.Empty;
string fieldName = String.Empty;
string paramName = String.Empty;
PropertyDescriptorCollection pdcList = TypeDescriptor.GetProperties(this);
foreach (PropertyDescriptor pdc in pdcList)
{
foreach (Attribute attr in pdc.Attributes)
{
if (attr is ModelDBAttribute)
{
var a = (ModelDBAttribute)attr;
if (a.needDelete())
{
fieldName = a.DelFieldName == String.Empty ? pdc.Name : a.DelFieldName;
paramName = a.DelParamName == String.Empty ? pdc.Name : a.DelParamName;
if (sbWhere.Length != 0)
{
sbWhere.Append(" and ");
}
sbWhere.Append(fieldName + "=@" + paramName);
}
}
}
}
if (Extended())
{
foreach (var d in ExtendDataList)
{
if (d.MDB.needDelete())
{
if (sbWhere.Length != 0)
{
sbWhere.Append(" and ");
}
sbWhere.Append(d.Name + "=@" + d.Name);
}
}
}
if (sbWhere.ToString() == String.Empty)
{
throw new NotSupportedException("请增加Model的属性已组成条件");
}
sbSql.Append(" delete from " + TableName);
sbSql.Append(" where ");
sbSql.Append(sbWhere.ToString());
return sbSql.ToString();
}
public override string GenDeleteSql(string USERID)
{
var sbUpdAndParam = new StringBuilder();
var sbWhere = new StringBuilder();
var sbSql = new StringBuilder();
string insertSql = String.Empty;
string fieldName = String.Empty;
string paramName = String.Empty;
PropertyDescriptorCollection pdcList = TypeDescriptor.GetProperties(this);
foreach (PropertyDescriptor pdc in pdcList)
{
foreach (Attribute attr in pdc.Attributes)
{
if (attr is ModelDBAttribute)
{
var a = (ModelDBAttribute)attr;
if (ModelDBOprationType.Delete == (ModelDBOprationType.Delete & a.MDBType))
{
fieldName = a.DelFieldName == String.Empty ? pdc.Name : a.DelFieldName;
paramName = a.DelParamName == String.Empty ? pdc.Name : a.DelParamName;
if (sbWhere.Length != 0)
{
sbWhere.Append(" and ");
}
sbWhere.Append(fieldName + "=@" + paramName);
}
}
}
}
if (Extended())
{
foreach (var d in ExtendDataList)
{
if (d.MDB.needDelete())
{
if (sbWhere.Length != 0)
{
sbWhere.Append(" and ");
}
sbWhere.Append(d.Name + "=@" + d.Name);
}
}
}
if (sbWhere.ToString() == String.Empty)
{
throw new NotSupportedException("请增加Model的属性已组成条件");
}
sbSql.Append(" update " + TableName + " set ISDELETE=1,DELETETIME=getdate(),DELETEUSER='" + USERID + "'");
sbSql.Append(" where ");
sbSql.Append(sbWhere.ToString());
return sbSql.ToString();
}
/// <summary>
/// 参数是目标对象,应该是【来源对象.Copy(目标对象)】
/// </summary>
/// <param name="tar"></param>
public void Copy(ModelObjectBase tar)
{
PropertyDescriptorCollection pdcList = TypeDescriptor.GetProperties(this);
PropertyDescriptorCollection tarList = TypeDescriptor.GetProperties(tar);
string fieldName1 = String.Empty;
string paramName1 = String.Empty;
string fieldName2 = String.Empty;
string paramName2 = String.Empty;
bool needcontinue = false;
foreach (PropertyDescriptor pdc in pdcList)
{
needcontinue = false;
foreach (PropertyDescriptor tarpdc in tarList)
{
foreach (Attribute attr in pdc.Attributes)
{
if (attr is ModelDBAttribute)
foreach (Attribute tarattr in tarpdc.Attributes)
{
if (tarattr is ModelDBAttribute)
{
var a = (ModelDBAttribute)attr;
var b = (ModelDBAttribute)tarattr;
fieldName1 = a.InsFieldName == String.Empty ? pdc.Name : a.InsFieldName;
fieldName2 = b.InsFieldName == String.Empty ? tarpdc.Name : b.InsFieldName;
if (fieldName1 == fieldName2)
tarpdc.SetValue(tar, pdc.GetValue(this));
needcontinue = true;
continue;
}
}
if (needcontinue) continue;
}
if (needcontinue) continue;
}
if (needcontinue) continue;
}
if (Extended())
{
foreach (var d in ExtendDataList)
{
tar.ExtendDataList.Add(d);
}
}
if (SaveDic.Count > 0)
{
foreach (var d in SaveDic)
{
tar.SaveDic.Add(d.Key, d.Value);
}
}
}
}
}