using System; using System.Collections.Generic; using System.Text; using System.Data; using Ant.Frame; using System.Linq; using System.Linq.Expressions; using Ant.Data; using System.Reflection; using Ant.DbExpressions; using Ant.Common; using Ant.Descriptors; namespace Ant.ORM { public class MSSqlQueryCommandBuilder : QueryCommandBuilder { public override QueryCommand GetQueryCommand() { QueryCommand cmd = null; EntityPersistType strtype = (!PersistType.IsNull()) ? PersistType : Md.PersistType;//如果PersistType不为空说明方法赋了操作方式,否则到实体中获取操作方式 switch (strtype) { case EntityPersistType.Save: cmd = ParserInsertCommand(); break; case EntityPersistType.Update: cmd = ParserUpdateEntyCommand(); break; case EntityPersistType.Delete: cmd = ParserDeleteCommand(); break; case EntityPersistType.Query://查询 cmd = ParserSelectCommand(); break; case EntityPersistType.Sum://统计记录数 cmd = ParserSumCommand(); break; case EntityPersistType.eNonDelete://假删除 cmd = ParserEXCommand(); break; case EntityPersistType.QueryPage://查询分页 cmd = ParserQueryPageCommand(); break; } return cmd; } #region 解析假删除 private QueryCommand ParserEXCommand() { QueryCommand qc = new QueryCommand(); //StringBuilder sql = new StringBuilder(); var FM = Md.FiledMeta;//列属性 //if (SqlType == SqlEnum.MainSql) //{ // foreach (string key in Md.Fields.Keys) // { // if (!FM.FieldMeteDatas[key].IsAutoincrement) // { // QueryParameter parameter = new QueryParameter(); // parameter.ParameterName = "@" + FM.FieldMeteDatas[key].ColumnName; // parameter.DbType = FM.FieldMeteDatas[key].ColumnType; // parameter.Value = Md.Fields[key]; // qc.Parameters.Add(parameter); // } // } //} //if (SqlType == SqlEnum.ChildSql) //{ // foreach (ChildMataData childmod in FM.ChildObjects.Values) // { // } //} //if (SqlType == SqlEnum.ReferenceSql) //{ // foreach (ReferenceMataData refermod in FM.ReferenceObjects.Values) // { // } //} //qc.CommandText = sql.ToString(); return qc; } #endregion #region 解析Insert SQL /// /// 解析Insert SQL /// /// private QueryCommand ParserInsertCommand() { QueryCommand qc = new QueryCommand(); List columnlist = new List(); List paramlist = new List(); List valuelist = new List(); bool IsAutoincrement = false; var typedesc = Md.FiledMeta.MemberColumnMap; foreach (var kv in typedesc) { MemberInfo member = kv.Key; //Md.FiledMeta.Fields.Add(member); MappingMemberDescriptor memberDescriptor = MetaDataManager.TryGetMappingMemberDescriptor(kv.Key, Md.FiledMeta); var val = (Md.FieldsColumns.Keys.Contains(member.Name)) ? Md.FieldsColumns[member.Name].Value : null; if (!MetaDataManager.IsAutoIncrement(memberDescriptor, Md)) { columnlist.Add(string.Format("[{0}]", memberDescriptor.Column.Name)); paramlist.Add("@" + memberDescriptor.Column.Name); QueryParameter parameter = new QueryParameter(); parameter.ParameterName = "@" + memberDescriptor.Column.Name; parameter.DbType = (DbType)AntUtils.TryGetDbType(memberDescriptor.Column.Type); parameter.Direction = ParameterDirection.Input; if (val.IsNull()) val = SetDefaultValue(parameter.DbType); parameter.Value = val; valuelist.Add("'" + val + "'"); qc.Parameters.Add(parameter); } } string sqlstr = string.Format(ConstSql.SQL_INSERT_TABLE, Md.FiledMeta.Table.Name, columnlist.AppendStrings(), paramlist.AppendStrings(), IsAutoincrement ? ConstSql.SQL_SCOPE_IDENTITY : string.Empty); qc.CommandText = sqlstr; qc.SqlString = string.Format(ConstSql.SQL_INSERT_TABLE, Md.FiledMeta.Table.Name, columnlist.AppendStrings(), valuelist.AppendStrings(), IsAutoincrement ? ConstSql.SQL_SCOPE_IDENTITY : string.Empty); return qc; } #endregion /// /// 获取自增长ID /// /// public string GetLastInsertID() { return "SELECT ISNULL(SCOPE_IDENTITY(),@@rowcount)"; } #region 解析Update SQL语句 /// /// 解析Update SQL语句 /// /// private QueryCommand ParserUpdateEntyCommand() { //string strsql = string.Format(" UPDATE {0} SET {1} WHERE {2} ", Md.TableName, "", ""); QueryCommand qc = new QueryCommand(); string strwhere = string.Empty; StringBuilder sql = new StringBuilder();//SQL语句 StringBuilder sqlstr = new StringBuilder(); List updateColumns = new List();//更新列 List StrupdateColumns = new List(); List WhereColumn = new List();//条件列 List StrWhereColumn = new List();//条件列 sql.AppendFormat("UPDATE [{0}] SET ", Md.FiledMeta.Table.Name); List condition = new List(); #region 更新字段 if (Md.UpdateColumns.IsNull()) { var typedesc = Md.FiledMeta.MemberColumnMap; if (Md.FiledMeta.AutoIncrement.IfNotNull()) { //IsAutoincrement = true; typedesc.Remove(Md.FiledMeta.AutoIncrement.MemberInfo); } foreach (var kv in typedesc) { MemberInfo member = kv.Key; MappingMemberDescriptor memberDescriptor = MetaDataManager.TryGetMappingMemberDescriptor(member, Md.FiledMeta); var column = memberDescriptor.Column; updateColumns.Add(string.Format("[{0}]=@{0}", column.Name)); qc.Parameters.Add("@" + column.Name, (DbType)AntUtils.TryGetDbType(column.Type), column.Value); StrupdateColumns.Add(string.Format("[{0}]='{1}'", column.Name, column.Value)); } } else { foreach (var column in Md.UpdateColumns) { if (column.Value.Value.IfNotNull()) { updateColumns.Add(string.Format("[{0}]=@{0}", column.Key)); qc.Parameters.Add("@" + column.Key, (DbType)AntUtils.TryGetDbType(column.Value.Type), column.Value.Value); StrupdateColumns.Add(string.Format("[{0}]='{1}'", column.Key, column.Value.Value)); } } } #endregion if (Md.FiledMeta.PrimaryKey.Column.Value.IfNotNull())//通过主键作用查询条件 { WhereColumn.Add(string.Format("[{0}]=@{0}", Md.FiledMeta.PrimaryKey.MemberInfo.Name)); qc.Parameters.Add("@" + Md.FiledMeta.PrimaryKey.Column.Name, (DbType)AntUtils.TryGetDbType(Md.FiledMeta.PrimaryKey.Column.Type), Md.FiledMeta.PrimaryKey.Column.Value); StrWhereColumn.Add(string.Format("[{0}]='{1}'", Md.FiledMeta.PrimaryKey.Column.Name, Md.FiledMeta.PrimaryKey.Column.Value)); } else {//通过查询实体进行查询 #region 给实体赋值的查询条件更新 foreach (var key in Md.WhereColumns.Values) { WhereColumn.Add(string.Format("[{0}]=@{0}", key.Name)); qc.Parameters.Add("@" + key.Name, (DbType)AntUtils.TryGetDbType(key.Type), key.Value); StrWhereColumn.Add(string.Format("[{0}]={1}", key.Name, key.Value)); } #endregion } if (updateColumns.Count > 0)//更新字段 { #region 带时间戳 if (Md.FieldsColumns.ContainsKey("Version")) { //WhereColumn.Add(string.Format(" {0}+0=@{0}", Md.FieldMeteDatas["Version"].ColumnName)); WhereColumn.Add(string.Format(" CONVERT(bigint,{0})=@{0}", Md.FieldsColumns["Version"].Name)); qc.Parameters.Add("@" + Md.FieldsColumns["Version"].Name, (DbType)AntUtils.TryGetDbType(Md.FieldsColumns["Version"].Type), Md.FieldsColumns["Version"].Value); StrWhereColumn.Add(string.Format(" CONVERT(bigint,{0})='{1}'", Md.FieldsColumns["Version"].Name, Md.FieldsColumns["Version"].Value)); } #endregion sql.Append(string.Join(",", updateColumns.ToArray())).Append(" WHERE ").Append(string.Join(" AND ", WhereColumn.ToArray())); if (!string.IsNullOrEmpty(Md.WhereSql)) {//有自定义查询条件的时候 if (Md.WhereSql.Trim().Length > 0) WhereColumn.Add(Md.WhereSql); } if (Predicate.IfNotNull()) { var FlieldWhere = new FieldValueCollection(); strwhere = Predicate.GetSql(FlieldWhere, qc);//拼接SQL语句 if (!strwhere.IsEmpty()) { sql.AppendFormat(" and {0} ", strwhere); foreach (string key in FlieldWhere.Keys) { strwhere = strwhere.Replace(key.ToString(), "'" + FlieldWhere[key].ToString() + "'"); } sqlstr.AppendFormat(" and {0} ", strwhere); } } qc.CommandText = sql.ToString(); qc.SqlString = string.Format(ConstSql.SQL_UPDATE_TABLE, Md.FiledMeta.Table.Name, string.Join(",", StrupdateColumns.ToArray()), string.Join(" AND ", StrWhereColumn.ToArray()) + (strwhere.IsEmpty() ? strwhere : " and " + strwhere)); } return qc; } #endregion #region 解析 Delete SQL语句 /// /// 解析 Delete SQL语句 /// /// private QueryCommand ParserDeleteCommand() { QueryCommand qc = new QueryCommand(); StringBuilder sql = new StringBuilder(); StringBuilder sqlstr = new StringBuilder(); List WhereColumn = new List();//条件列集合 List WhereColumnStr = new List(); if (!Md.FieldsColumns.IsNull()) { foreach (string key in Md.FieldsColumns.Keys)//查询条件 { //if (!Object.Equals(Md.Fields[key], null) || !Object.Equals(Md.Fields[key], DBNull.Value)) if (!(Md.FieldsColumns[key].IsNull())) { if (!Md.FieldsColumns[key].Value.ToString().IsEmpty()) { WhereColumn.Add(string.Format(" [{0}].{1}=@{2} ", Md.FiledMeta.Table.Name, Md.FieldsColumns[key].Name, Md.FieldsColumns[key].Name)); qc.Parameters.Add("@" + Md.FieldsColumns[key].Name, (DbType)AntUtils.TryGetDbType(Md.FieldsColumns[key].Type), Md.FieldsColumns[key].Value); WhereColumnStr.Add(string.Format(" [{0}].{1}={2} ", Md.FiledMeta.Table.Name, Md.FieldsColumns[key].Name, Md.FieldsColumns[key].Value)); } } } } if (!Md.WhereSql.IsNull()) { if (Md.WhereSql.Trim().Length > 0) { string sqlwherestr = (Md.WhereSql.StartsWith("(") && Md.WhereSql.EndsWith(")")) ? Md.WhereSql : " (" + Md.WhereSql + ") "; WhereColumn.Add(sqlwherestr); WhereColumnStr.Add(sqlwherestr); } } sql.AppendFormat(ConstSql.SQL_DELETE_DATA, Md.FiledMeta.Table.Name, (WhereColumn.Count > 0) ? string.Format(" and {0}", string.Join(" AND ", WhereColumn.ToArray())) : string.Empty); sqlstr.AppendFormat(ConstSql.SQL_DELETE_DATA, Md.FiledMeta.Table.Name, (WhereColumnStr.Count > 0) ? string.Format(" and {0}", string.Join(" AND ", WhereColumnStr.ToArray())) : string.Empty); if (Predicate.IfNotNull()) { var FlieldWhere = new FieldValueCollection(); string strwhere = Predicate.GetSql(FlieldWhere, qc);//拼接SQL语句 if (!strwhere.IsEmpty()) { sql.AppendFormat(" and {0} ", strwhere); foreach (string key in FlieldWhere.Keys) { strwhere = strwhere.Replace(key.ToString(), "'" + FlieldWhere[key].ToString() + "'"); } sqlstr.AppendFormat(" and {0} ", strwhere); } } qc.CommandText = sql.ToString(); qc.SqlString = sqlstr.ToString(); return qc; } #endregion #region 解析 Select SQL语句 /// /// 解析 Select SQL语句 /// /// private QueryCommand ParserSelectCommand() { QueryCommand qc = new QueryCommand() { DbParmChar = DbParmChar }; StringBuilder sql = new StringBuilder(); StringBuilder sqlstr = new StringBuilder(); switch (SqlType) { case SqlEnum.MainSql: { string topnum = Top.IsEmpty() ? string.Empty : " top " + Top; sql.AppendFormat(ConstSql.SQL_GET_VALUE, topnum, FieldColumn(), Md.FiledMeta.Table.Name);//显示自定义的字段 List WhereColumn = new List();//条件列集合 List WhereColumnStr = new List();//条件列集合 if (Md.FieldsColumns.IfNotNull())//查询条件 { foreach (string key in Md.FieldsColumns.Keys) { var field = Md.FieldsColumns[key]; if (!(field.Value.IsNull())) { if (!field.Value.ToString().IsEmpty()) { WhereColumn.Add(string.Format(" [{0}].{1}=@{2} ", Md.FiledMeta.Table.Name, field.Name, field.Name)); qc.Parameters.Add("@" + field.Name, (DbType)AntUtils.TryGetDbType(field.Type), field.Value); WhereColumnStr.Add(string.Format(" [{0}].{1}='{2}' ", Md.FiledMeta.Table.Name, field.Name, field.Value)); } } } } else { if (!Md.WhereSql.IsEmpty()) sql.AppendFormat(" and {0} ", Md.WhereSql); } sqlstr.Append(sql.ToString()); if (WhereColumn.Count > 0) sql.AppendFormat(" and {0} ", string.Join(" AND ", WhereColumn.ToArray())); if (WhereColumnStr.Count > 0) sqlstr.AppendFormat(" and {0} ", string.Join(" AND ", WhereColumnStr.ToArray())); if (Predicate.IfNotNull()) { var FlieldWhere = new FieldValueCollection(); string strwhere = Predicate.GetSql(FlieldWhere, qc);//拼接SQL语句 if (!strwhere.IsEmpty()) { sql.AppendFormat(" and {0} ", strwhere); foreach (string key in FlieldWhere.Keys) { strwhere = strwhere.Replace(key.ToString(), "'" + FlieldWhere[key].ToString() + "'"); } sqlstr.AppendFormat(" and {0} ", strwhere); } } string orderstr = GetOrderBy(); sql.Append(orderstr); sqlstr.Append(orderstr); WhereColumn = null; WhereColumnStr = null; } break; } qc.CommandText = sql.ToString(); qc.SqlString = sqlstr.ToString(); sqlstr = null; sql = null; return qc; } /// /// 获取排序 /// /// public string GetOrderBy() { string orderbystr = string.Empty; if (Sort.IsNull()) { orderbystr = (orderbystr.Trim().IndexOf("order by", StringComparison.InvariantCultureIgnoreCase) != -1) ? string.Format(" {0} ", Md.FiledMeta.PrimaryKey.MemberInfo.Name) : string.Format(" order by {0}", Md.FiledMeta.PrimaryKey.MemberInfo.Name); } else { string orderby = string.Empty; foreach (ISort sort in Sort) { if (orderby.IsEmpty()) { orderby = sort.PropertyName + (sort.Ascending ? " ASC" : " DESC"); } else { orderby += " ," + sort.PropertyName + (sort.Ascending ? " ASC" : " DESC"); } } orderbystr = string.Format(" ORDER BY {0} ", orderby); } return orderbystr; } /// /// 解析 Select 所有记录 SQL语句 /// /// private QueryCommand ParserSumCommand() { QueryCommand qc = new QueryCommand(); StringBuilder sql = new StringBuilder(); StringBuilder sqlstr = new StringBuilder(); sql.AppendFormat(" SELECT COUNT(1) FROM [{0}] with(nolock) WHERE 1=1 ", Md.FiledMeta.Table.Name); sqlstr.AppendFormat(" SELECT COUNT(1) FROM [{0}] with(nolock) WHERE 1=1 ", Md.FiledMeta.Table.Name); List WhereColumn = new List();//条件列集合 List WhereColumnStr = new List();//条件列集合 if (!Md.FiledMeta.Fields.IsNull()) { foreach (string key in Md.FieldsColumns.Keys)//查询条件 { //if (!Object.Equals(Md.Fields[key], null) || !Object.Equals(Md.Fields[key], DBNull.Value)) if (!(Md.FieldsColumns[key].IsNull())) { if (!Md.FieldsColumns[key].Value.ToString().IsEmpty()) { WhereColumn.Add(string.Format(" [{0}].{1}=@{2} ", Md.FiledMeta.Table.Name, Md.FieldsColumns[key].Name, Md.FieldsColumns[key].Name)); qc.Parameters.Add("@" + Md.FieldsColumns[key].Name, (DbType)AntUtils.TryGetDbType(Md.FieldsColumns[key].Type), Md.FieldsColumns[key].Value); WhereColumnStr.Add(string.Format(" [{0}].{1}='{2}' ", Md.FiledMeta.Table.Name, Md.FieldsColumns[key].Name, Md.FieldsColumns[key].Value)); } } } } if (!Md.WhereSql.IsNull()) { if (Md.WhereSql.Trim().Length > 0) { string sqlwherestr = (Md.WhereSql.StartsWith("(") && Md.WhereSql.EndsWith(")")) ? Md.WhereSql : " (" + Md.WhereSql + ") "; WhereColumn.Add(sqlwherestr); WhereColumnStr.Add(sqlwherestr); } } if (WhereColumn.Count > 0) sql.AppendFormat(" and {0} ", string.Join(" AND ", WhereColumn.ToArray())); if (WhereColumnStr.Count > 0) sqlstr.AppendFormat(" and {0} ", string.Join(" AND ", WhereColumnStr.ToArray())); if (Predicate.IfNotNull()) { var FlieldWhere = new FieldValueCollection(); string strwhere = Predicate.GetSql(FlieldWhere, qc);//拼接SQL语句 if (!strwhere.IsEmpty()) { sql.AppendFormat(" and {0} ", strwhere); foreach (string key in FlieldWhere.Keys) { strwhere = strwhere.Replace(key.ToString(), "'" + FlieldWhere[key].ToString() + "'"); } sqlstr.AppendFormat(" and {0} ", strwhere); } } qc.CommandText = sql.ToString(); qc.SqlString = sqlstr.ToString(); sqlstr = null; sql = null; WhereColumn = null; WhereColumnStr = null; return qc; } #endregion #region 解析 查询分页 SQL语句 /// /// 解析 Select SQL语句 /// /// private QueryCommand ParserQueryPageCommand() { List WhereColumn = new List(); List WhereColumnStr = new List();//条件列集合 QueryCommand qc = new QueryCommand() { DbParmChar = DbParmChar }; StringBuilder sql = new StringBuilder(); if (Md.FieldsColumns.IfNotNull())//查询条件 { foreach (string key in Md.FieldsColumns.Keys) { var field = Md.FieldsColumns[key]; if (!(field.Value.IsNull())) { if (!field.Value.ToString().IsEmpty()) { string parmname = string.Format("@{0}_{1}", field.Name, qc.Parameters.Count); WhereColumn.Add(string.Format(" [{0}].{1}=@{2} ", Md.FiledMeta.Table.Name, field.Name, parmname)); qc.Parameters.Add("@" + parmname, (DbType)AntUtils.TryGetDbType(field.Type), field.Value); WhereColumnStr.Add(string.Format(" [{0}].{1}='{2}' ", Md.FiledMeta.Table.Name, field.Name, field.Value)); } } } } sql.AppendFormat(" select {0} ", "*"); sql.AppendFormat(" from ( select top {0} {1} ,ROW_Number() OVER ( order by [{2}].{3} ) AS r", PageNo * PageSize, FieldColumn(), Md.FiledMeta.Table.Name, ""); sql.AppendFormat(" FROM [{0}] with(nolock) WHERE 1=1 ", Md.FiledMeta.Table.Name); if (WhereColumn.Count > 0) sql.AppendFormat(" and {0}", string.Join(" AND ", WhereColumn.ToArray())); //if (Predicate.IfNotNull()) //{ // string strwhere = Predicate.GetSql(Md, qc);//拼接SQL语句 // sql.AppendFormat(" and {0}", strwhere); //} if (Predicate.IfNotNull()) { var FlieldWhere = new FieldValueCollection(); string strwhere = Predicate.GetSql(FlieldWhere, qc);//拼接SQL语句 if (!strwhere.IsEmpty()) { sql.AppendFormat(" and {0} ", strwhere); //foreach (string key in FlieldWhere.Keys) //{ // strwhere = strwhere.Replace(key.ToString(), "'" + FlieldWhere[key].ToString() + "'"); //} //sqlstr.AppendFormat(" and {0} ", strwhere); } } if (Md.WhereSql.Length > 0) sql.AppendFormat(" {0}", Md.WhereSql); sql.AppendFormat(" ) A where A.r BETWEEN '{0}' AND '{1}'", (((PageNo - 1) * PageSize) + 1), (PageNo * PageSize)); if (!qc.SqlNotes.IsNull()) qc.CommandText = sql.ToString(); else qc.CommandText = sql.ToString(); string sqlstr = sql.ToString(); qc.SqlString = sqlstr; return qc; } #endregion /// /// 获取显示字段列 /// /// private string FieldColumn() { List columns = new List(); string fieldcolumn = string.Empty; if (!ShowField.IsEmpty()) { fieldcolumn = ShowField; } else { foreach (MemberInfo df in Md.FiledMeta.MemberColumnMap.Keys)//显示字段 { columns.Add(string.Format("{0}", "[" + Md.FiledMeta.Table.Name + "]." + df.Name)); } fieldcolumn = string.Join(",", columns.ToArray()); } fieldcolumn = fieldcolumn.IsEmpty() ? " * " : fieldcolumn; return fieldcolumn; } private QueryCommand ParserRightQueryCommand() { List columns = new List(); List WhereColumn = new List(); QueryCommand qc = new QueryCommand(); StringBuilder sql = new StringBuilder(); return qc; } /// /// 通配符转换 /// /// /// protected static string GetEscape(string str) { return str.Replace("!", "!!").Replace("%", "!%").Replace("_", "!_"); } /// /// 判断是否有记录 /// /// private bool IsMdValuesCount() { //if (!Object.Equals(Md.Values, null) && !Object.Equals(Md.Values, DBNull.Value)) //{ // if (Md.Values.Count > 0) // return true; //} return false; } /// /// 判断是否有值 /// /// /// private bool IsFieldValue(FieldValueCollection fieldvalue) { if (!Object.Equals(fieldvalue, null) && !Object.Equals(fieldvalue, DBNull.Value)) { if (fieldvalue.Count > 0) { return true; } } return false; } /// /// 获取默认值 /// /// /// private object SetDefaultValue(DbType ColumnType) { object value = null; switch (ColumnType) { case DbType.String: { value = ""; } break; case DbType.Boolean: { value = false; } break; case DbType.Decimal: case DbType.Double: case DbType.Int32: case DbType.Int16: case DbType.Int64: { value = 0; } break; case DbType.DateTime: { value = DateTime.Now; } break; } //if (Md.FieldMeteDatas[key].ColumnType == DbType.String) // value = ""; //if (Md.FieldMeteDatas[key].ColumnType == DbType.Boolean) // value = false; //if (Md.FieldMeteDatas[key].ColumnType == DbType.Decimal || Md.FieldMeteDatas[key].ColumnType == DbType.Double) // value = 0; //if (Md.FieldMeteDatas[key].ColumnType == DbType.Int32) // value = 0; //if (Md.FieldMeteDatas[key].ColumnType == DbType.Int16) // value = 0; //if (Md.FieldMeteDatas[key].ColumnType == DbType.Int64) // value = 0; //if (Md.FieldMeteDatas[key].ColumnType == DbType.DateTime) // value = DateTime.Now; //if (Md.FieldMeteDatas[key].ColumnType == DbType.Guid) // value = Guid.NewGuid(); return value; } } }