public void GetFilterSQL() { //QueryParameterInfo[] parInfos = new MB.Util.Serializer.QueryParameterXmlSerializer().DeSerializer(xmlFilterParams); //string sqlFilter = MB.Orm.DbSql.SqlShareHelper.Instance.QueryParametersToSqlString(null, parInfos); QueryParameterInfo info1 = new QueryParameterInfo("Code", "111", Util.DataFilterConditions.Equal); QueryParameterInfo info2 = new QueryParameterInfo("Date", "222", Util.DataFilterConditions.Between); info2.Value2 = "333"; QueryParameterInfo info3 = new QueryParameterInfo("Name", "4444", Util.DataFilterConditions.Like); QueryParameterInfo[] parInfos = new QueryParameterInfo[3]; parInfos[0] = info1; parInfos[1] = info2; parInfos[2] = info3; string sqlFilter = MB.Orm.DbSql.SqlShareHelper.Instance.QueryParametersToSqlString(null, parInfos); string xmlFilterParams = @"<FilterRoot AdvanceFilter='False'><Parameter><PropertyName>CREATE_DATE</PropertyName><Value><![CDATA[2007/5/3 0:00:00]]></Value><Value2><![CDATA[2012/5/17 0:00:00]]></Value2><Condition>Between</Condition><DataType>DateTime</DataType><OrderIndex>0</OrderIndex><Limited>False</Limited><MultiValue>False</MultiValue></Parameter><Parameter><PropertyName>LAST_MODIFIED_DATE</PropertyName><Value><![CDATA[2007/5/17 0:00:00]]></Value><Value2><![CDATA[2012/5/17 0:00:00]]></Value2><Condition>Between</Condition><DataType>DateTime</DataType><OrderIndex>0</OrderIndex><Limited>False</Limited><MultiValue>False</MultiValue></Parameter></FilterRoot>"; parInfos = new MB.Util.Serializer.QueryParameterXmlSerializer().DeSerializer(xmlFilterParams); sqlFilter = MB.Orm.DbSql.SqlShareHelper.Instance.QueryParametersToSqlString(null, parInfos); }
//反系列化 查询字符窜。 private void fillListEntity(List <QueryParameterInfo> lstData, XmlNodeList nodeList) { foreach (XmlNode node in nodeList) { QueryParameterInfo info = new QueryParameterInfo(); if (string.Compare(node.Name, GROUP_NAME, true) == 0) { if (node.ChildNodes.Count == 0) { continue; } info.IsGroupNode = true; if (node.Attributes["GroupNodeLinkType"] != null && !string.IsNullOrEmpty(node.Attributes["GroupNodeLinkType"].Value)) { info.GroupNodeLinkType = (QueryGroupLinkType)Enum.Parse(typeof(QueryGroupLinkType), node.Attributes["GroupNodeLinkType"].Value); } else { info.GroupNodeLinkType = QueryGroupLinkType.AND; } List <QueryParameterInfo> childs = new List <QueryParameterInfo>(); info.Childs = childs; fillListEntity(childs, node.ChildNodes); } else { fillSingleProperty(info, node); } lstData.Add(info); } }
/// <summary> /// 追加参数。 /// </summary> /// <param name="paramName"></param> /// <param name="value"></param> /// <param name="condition"></param> /// <returns></returns> public QueryParameterInfo AddParameterInfo(string paramName, object value, DataFilterConditions condition) { QueryParameterInfo newParm = new QueryParameterInfo(paramName, value, condition); _DataList.Add(newParm); return(newParm); }
/// <summary> /// 追加分组节点。 /// </summary> /// <param name="linkType"></param> /// <returns></returns> public QueryParameterInfo AddParameterGroup(MB.Util.Model.QueryGroupLinkType linkType) { QueryParameterInfo newParm = new QueryParameterInfo(linkType); _DataList.Add(newParm); return(newParm); }
public void AssignParameters( IEnumerable <QueryParameterInfo> parameters, IEnumerable <ParameterValue> parameterValues, List <Tuple <int, string> > parametersQueueForOdbc ) { if (parametersQueueForOdbc != null && parametersQueueForOdbc.Any() && parameters != null) { foreach (Tuple <int, string> currentTuple in parametersQueueForOdbc) { QueryParameterInfo currentParam = parameters.FirstOrDefault(x => x.Name == currentTuple.Item2); if (currentParam != null) { OdbcParameter p = this._command.CreateParameter(); p.ParameterName = currentParam.Name; p.IsNullable = true; p.DbType = currentParam.Type.ToDbType(); p.Value = currentParam.GetDefaultValue(); this._command.Parameters.Add(p); } } } else if (parameters != null) { foreach (QueryParameterInfo parameter in parameters) { OdbcParameter p = this._command.CreateParameter(); p.ParameterName = parameter.Name; p.IsNullable = true; p.DbType = parameter.Type.ToDbType(); p.Value = parameter.GetDefaultValue(); this._command.Parameters.Add(p); } } if (parameterValues != null) { foreach (ParameterValue value in parameterValues) { List <OdbcParameter> currentParameters = (from OdbcParameter p in this._command.Parameters where p.ParameterName == value.Name select p) .ToList(); foreach (OdbcParameter currentParameter in currentParameters) { if (currentParameter != null) { currentParameter.Value = value.GetValue(currentParameter.DbType); } } } } }
/// <summary> /// 删除参数。 /// </summary> /// <param name="paramName"></param> public void RemoveParameterInfo(string paramName) { QueryParameterInfo info = _DataList.Find(o => string.Compare(o.PropertyName, paramName, true) == 0); if (info != null) { _DataList.Remove(info); } }
//根据Node 的节点给每个属性赋值。 private void fillSingleProperty(QueryParameterInfo entity, XmlNode xmlNode) { PropertyInfo[] pros = entity.GetType().GetProperties(); foreach (PropertyInfo info in pros) { if (info.IsSpecialName || !info.CanWrite) { continue; } DataMemberAttribute att = Attribute.GetCustomAttribute(info, typeof(DataMemberAttribute)) as DataMemberAttribute; if (att == null) { continue; } //非查询需要的参数属性去除掉 if (Array.IndexOf(PARAM_EXCEPTION_PROS_NAME, info.Name) >= 0) { continue; } XmlNode propertyNode = getNodeByNodeName(xmlNode.ChildNodes, info.Name); if (propertyNode == null) { continue; } if (string.IsNullOrEmpty(propertyNode.InnerText)) { continue; } object val = propertyNode.InnerText.Trim(); //考虑到Enum 的值都是通过描述来配置的,所以这里需要特殊处理一下。 if (info.PropertyType.IsEnum) { val = Enum.Parse(info.PropertyType, val.ToString()); } MB.Util.MyReflection.Instance.InvokePropertyForSet(entity, info.Name, val); } }
/// <summary> /// 重新刷新实体对象。 /// 1)应该先找对应配置的XML 文件中是否已经配置了 RefreshEntity /// 2)如果用户没有配置再根据 GetObjects 查找 /// </summary> /// <param name="baseRule"></param> /// <param name="dataInDocType"></param> /// <param name="entity"></param> /// <returns></returns> public object RefreshEntity(IBaseRule baseRule, object dataInDocType, object entity, params object[] parValues) { string keyPropertyName = string.Empty; object key = MB.Orm.Persistence.EntityDataHelper.Instance.GetEntityKeyValue(entity, out keyPropertyName); MB.Util.Model.QueryParameterInfo[] pars = new QueryParameterInfo[1]; pars[0] = new QueryParameterInfo(keyPropertyName, key, MB.Util.DataFilterConditions.Equal); List <object> lstData = GetObjects <object>(baseRule, dataInDocType, pars, parValues); if (lstData == null || lstData.Count == 0) { return(null); } else { return(lstData[0]); } }
//系列化单的对象 private void serializeSingleObject(StringBuilder sXml, QueryParameterInfo val) { Type t = val.GetType(); PropertyInfo[] pros = t.GetProperties(); foreach (PropertyInfo info in pros) { if (info.IsSpecialName) { continue; } object[] att = info.GetCustomAttributes(typeof(DataMemberAttribute), true); if (att == null || att.Length == 0) { continue; } //非查询需要的参数属性去除掉 if (Array.IndexOf(PARAM_EXCEPTION_PROS_NAME, info.Name) >= 0) { continue; } Type proType = info.PropertyType; object v = info.GetValue(val, null); if (v != null) { writeFirstMarker(sXml, info.Name); if (info.Name == "Value" || info.Name == "Value2") { valueToXmlString(sXml, v, proType); } //sXml.Append(string.Format("<![CDATA[{0}]]>",v.ToString().Trim())); else { sXml.Append(v.ToString()); } writeLastMarker(sXml, info.Name); } } }
/// <summary> /// 为逗号分割的多个值生成子查询参数,以OR连接.用于模糊查询. /// </summary> /// <param name="parInfo">原始的查询参数</param> private void createChildQueryParameterForMultiValue(QueryParameterInfo parInfo) { if (parInfo.Condition == Util.DataFilterConditions.BenginsWith || parInfo.Condition == Util.DataFilterConditions.EndsWith || parInfo.Condition == Util.DataFilterConditions.Like) { // 多值模糊查询 if (parInfo.MultiValue && parInfo.Value != null) { string multipleValue = parInfo.Value.ToString(); // 逗号分割 if (multipleValue.Contains(",")) { parInfo.IsGroupNode = true; parInfo.GroupNodeLinkType = QueryGroupLinkType.OR; var values = multipleValue.Split(new char[] { ',' }); foreach (var value in values) { // 忽略空字符串 if (!string.IsNullOrEmpty(value.Trim())) { var childQueryParameter = new QueryParameterInfo(parInfo.PropertyName, value, parInfo.Condition, parInfo.Limited); if (parInfo.Childs == null) { parInfo.Childs = new List <QueryParameterInfo>(); } parInfo.Childs.Add(childQueryParameter); } } } } } }
private bool filterObjectsByInput(bool isKeyDown) { try { if (!checkCanQueryData()) { return(false); } if (_FrmDataAssistant == null || _ColumnEditCfgInfo.NeedCreate) { createFilterObjectData(); } if (_ErrorProvider != null) { _ErrorProvider.SetError(this, string.Empty); } int docType = 0; bool needValidation = true;//需要验证输入数据 // 生成查询条件,默认为Equal,该查询仅仅用于验证 List <MB.Util.Model.QueryParameterInfo> lst = new List <MB.Util.Model.QueryParameterInfo>(); var queryPara = new QueryParameterInfo(_ColumnEditCfgInfo.TextFieldName, this.btnEdit.Text, DataFilterConditions.Equal); lst.Add(queryPara); // 在查询窗口或者获取对象助手窗口中,需要根据FilterElementInfo信息进一步处理 if (this.ParentForm is IQueryFilterForm || this.ParentForm is IGetObjectDataAssistant) { if (this.FilterElementInfo != null) { // 多选,进行验证 if ((this.FilterElementInfo.FilterCondition == Util.DataFilterConditions.In || this.FilterElementInfo.FilterCondition == Util.DataFilterConditions.Equal) && this.MultiSelect) { queryPara.Condition = Util.DataFilterConditions.In; } else if (this.FilterElementInfo.FilterCondition == Util.DataFilterConditions.BenginsWith || this.FilterElementInfo.FilterCondition == Util.DataFilterConditions.EndsWith || this.FilterElementInfo.FilterCondition == Util.DataFilterConditions.Like) { // 模糊查询,不进行验证 needValidation = false; } } } // 验证输入的值是否正确 if (needValidation) { var lstData = _FrmDataAssistant.GetFilterObjects(docType, lst); if (lstData == null || lstData.Count == 0) { if (_ErrorProvider == null) { _ErrorProvider = new ErrorProvider(); } if (isKeyDown) { _ErrorProvider.SetError(this, "当前输入不是合法的数据,请重新输入!"); } else { btnEdit.Text = string.Empty; } } else { setSelectValue(lstData, isKeyDown); if (_ErrorProvider != null) { _ErrorProvider = null; } } } } catch (Exception ex) { MB.WinBase.ApplicationExceptionTerminate.DefaultInstance.ExceptionTerminate(ex); return(false); } return(true); }
/// <summary> /// 根据输入的条件获取查询的参数。 /// </summary> /// <returns></returns> public MB.Util.Model.QueryParameterInfo[] GetQueryParameters() { List <MB.Util.Model.QueryParameterInfo> parameters = new List <MB.Util.Model.QueryParameterInfo>(); bool validated = true; foreach (MB.WinBase.Binding.ColumnBindingInfo bindingInfo in _EditColumnCtlBinding.Values) { if (!_DataElementCfgs.ContainsKey(bindingInfo.ColumnName)) { throw new MB.Util.APPException(string.Format("DataFilterElements配置中不包含列 {0}", bindingInfo.ColumnName), MB.Util.APPMessageType.SysErrInfo); } DataFilterElementCfgInfo filterCfgInfo = _DataElementCfgs[bindingInfo.ColumnName]; MB.WinBase.Common.EditControlType controlType = (EditControlType)Enum.Parse(typeof(EditControlType), filterCfgInfo.EditControlType); Control ctl = bindingInfo.BindingControl; //先情况错误的消息描述。 _ErrorProvider.SetError(ctl, string.Empty); switch (controlType) { case EditControlType.TextBox: case EditControlType.Combox_DropDown: case EditControlType.Combox_DropDownList: case EditControlType.ClickButtonInput: if (!string.IsNullOrEmpty(ctl.Text.Trim())) { MB.Util.Model.QueryParameterInfo parInfo = new MB.Util.Model.QueryParameterInfo(bindingInfo.ColumnName, ctl.Text, filterCfgInfo.FilterCondition, filterCfgInfo.LimitColumn); if (controlType == EditControlType.TextBox || controlType == EditControlType.ClickButtonInput) { parInfo.MultiValue = filterCfgInfo.AllowMultiValue; // 生成子查询条件支持多值模糊查询.XiaoMin createChildQueryParameterForMultiValue(parInfo); } //end parameters.Add(parInfo); } else { if (!filterCfgInfo.Nullable) { _ErrorProvider.SetError(ctl, MSG_NOT_ALLOW_NULL_ABLE); validated = false; } } break; case EditControlType.CheckBox: CheckBox cBox = ctl as CheckBox; MB.Util.Model.QueryParameterInfo bparInfo = new MB.Util.Model.QueryParameterInfo(bindingInfo.ColumnName, cBox.Checked, filterCfgInfo.FilterCondition, filterCfgInfo.LimitColumn); bparInfo.DataType = "System.Boolean"; parameters.Add(bparInfo); break; case EditControlType.ComboCheckedListBox: MB.WinBase.Ctls.ucComboCheckedListBox comboListBox = ctl as MB.WinBase.Ctls.ucComboCheckedListBox; string str = string.Join(",", comboListBox.GetAllCheckedItemsKey()); if (!string.IsNullOrEmpty(str)) { MB.Util.Model.QueryParameterInfo parInfo = new MB.Util.Model.QueryParameterInfo(bindingInfo.ColumnName, str, filterCfgInfo.FilterCondition, filterCfgInfo.LimitColumn); parInfo.MultiValue = true; //如果设置为该控件,那么就必须允许输入多个值。 parameters.Add(parInfo); } else { if (!filterCfgInfo.Nullable) { _ErrorProvider.SetError(ctl, MSG_NOT_ALLOW_NULL_ABLE); validated = false; } } break; case EditControlType.LookUpEdit: ComboBox box = ctl as ComboBox; if (box.SelectedIndex >= 0 && !string.IsNullOrEmpty(box.Text.Trim())) { parameters.Add(new MB.Util.Model.QueryParameterInfo(bindingInfo.ColumnName, box.SelectedValue, filterCfgInfo.FilterCondition, filterCfgInfo.LimitColumn)); } else { if (!filterCfgInfo.Nullable) { _ErrorProvider.SetError(ctl, MSG_NOT_ALLOW_NULL_ABLE); validated = false; } } break; case EditControlType.DateFilterCtl: MB.WinBase.Ctls.ucEditDateFilter dateFilter = ctl as MB.WinBase.Ctls.ucEditDateFilter; if (dateFilter.DateFilterType != MB.WinBase.Ctls.ucEditDateFilter.DateFilterEditType.None) { MB.Util.Model.DateFilterStruct dateFilterValue = dateFilter.CurrentSettingValue; MB.Util.Model.QueryParameterInfo dateInfo = new MB.Util.Model.QueryParameterInfo(bindingInfo.ColumnName, dateFilterValue.BeginDate, MB.Util.DataFilterConditions.Between, filterCfgInfo.LimitColumn); dateInfo.DataType = "DateTime"; dateInfo.Value2 = dateFilterValue.EndDate; //服务端不在过滤时间的问题 if (dateInfo.Value != null) { dateInfo.Value = DateTime.Parse(((DateTime)dateInfo.Value).ToString(filterCfgInfo.Formate)); } if (dateInfo.Value2 != null) { dateInfo.Value2 = DateTime.Parse(((DateTime)dateInfo.Value2).ToString(filterCfgInfo.Formate)); } parameters.Add(dateInfo); } else { if (!filterCfgInfo.Nullable) { _ErrorProvider.SetError(ctl, MSG_NOT_ALLOW_NULL_ABLE); validated = false; } } break; case EditControlType.PopupRegionEdit: MB.WinBase.Ctls.ucPopupRegionEdit regionEdit = ctl as MB.WinBase.Ctls.ucPopupRegionEdit; if (_ClientRule.UIRuleXmlConfigInfo.ColumnsCfgEdit != null && _ClientRule.UIRuleXmlConfigInfo.ColumnsCfgEdit.ContainsKey(filterCfgInfo.Name)) { regionEdit.ColumnEditCfgInfo = _ClientRule.UIRuleXmlConfigInfo.ColumnsCfgEdit[filterCfgInfo.Name]; var curRegion = regionEdit.CurRegionEdit; foreach (var data in regionEdit.ColumnEditCfgInfo.EditCtlDataMappings) { object obj = MB.Util.MyReflection.Instance.InvokePropertyForGet(curRegion, data.SourceColumnName); if (obj != null && !string.IsNullOrEmpty(obj.ToString())) { MB.Util.Model.QueryParameterInfo param = new QueryParameterInfo(data.ColumnName, obj, MB.Util.DataFilterConditions.Equal); parameters.Add(param); } } } break; default: break; } } if (!validated) { throw new MB.Util.APPException("查询条件输入有误,请检查!", MB.Util.APPMessageType.DisplayToUser); } return(parameters.ToArray()); }