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.
DS7/HcDBUtility/Core/ModelObjectBase.cs

817 lines
29 KiB
C#

3 years ago
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);
}
}
}
public void SetSaveDic(ModelObjectBase tar)
{
if (SaveDic.Count > 0)
{
foreach (var d in SaveDic)
{
tar.SaveDic.Add(d.Key, d.Value);
}
}
}
}
}