/// <summary>
 /// Объединяет два списка параметров и возвращает результат
 /// </summary>
 public TParams_EMPTY MergeParams(TParams_EMPTY value)
 {
     if (value == null) return this;
     foreach (KeyValuePair<String, Object> param in value.FData)
     {
         AddParam(param.Key, param.Value);
     }
     return this;
 }
 /// <summary>
 /// Определяет, равны ли списки параметров
 /// </summary>
 /// <param name="arg"></param>
 /// <returns>Список параметров, который требуется сравнить с текущим</returns>
 public bool Equals(TParams_EMPTY arg)
 {
     if (arg == null) return false;
     if (FData.Count != arg.FData.Count) return false;
     foreach (KeyValuePair<String, Object> param in FData)
     {
         if (!arg.FData.ContainsKey(param.Key)) return false;
         if (!EqualValues(arg.FData[param.Key], param.Value)) return false;
     }
     return true;
 }
        /// <summary>
        /// Проверяет пересечение параметров, если общие параметры равны, то истина иначе ложь
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public Boolean Crossing(TParams_EMPTY value)
        {
            // -=MD=-: Я посчитал что правильно вернуть фальс
            // if (IsNull || value.IsNull) return false;

            if (value == null) return true;
            foreach (KeyValuePair<String, Object> param in value.FData)
            {
                if (FData.ContainsKey(param.Key) && !EqualValues(FData[param.Key], param.Value)) return false;
            }
            return true;
        }
 /// <summary>
 /// Возвращает пересечение двух списков параметров
 /// </summary>
 /// <param name="value"></param>
 /// <returns></returns>
 public TParams_EMPTY CrossParams(TParams_EMPTY value)
 {
     if (value == null)
     {
         Clear();
         return this;
     };
     List<String> keys = new List<String>();
     foreach (KeyValuePair<String, Object> param in value.FData)
     {
         if (FData.ContainsKey(param.Key) && EqualValues(FData[param.Key], param.Value)) keys.Add(param.Key);
     }
     for (Int32 i = FData.Count - 1; i >= 0; i--)
     {
         if (keys.IndexOf(FData.Keys[i]) < 0) FData.RemoveAt(i);
     }
     return this;
 }
 /// <summary>
 /// Возвращает значение параметра типа TParams_EMPTY
 /// </summary>
 public TParams_EMPTY AsParams(SqlString name)
 {
     if (!FData.ContainsKey(name.Value)) return null;
     Object value = FData[name.Value];
     if (value is TParams_EMPTY) return (TParams_EMPTY)value;
     else if (value is SqlString)
     {
         TParams_EMPTY result = (TParams_EMPTY)System.Activator.CreateInstance(this.GetType());
         result.FromString((String)(SqlString)value);
         return result;
     }
     else if (value is SqlXml)
     {
         TParams_EMPTY result = new TParams_EMPTY();
         result.ReadXml((value as SqlXml).CreateReader());
         return result;
     }
     else
         throw new Exception(String.Format("Не удалось сконвертировать значение '{0}' параметра '{1}' в тип {2}", ValueToString(value, ValueDbStyle.Text), name.Value, this.GetType().Name));
 }