Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 CLR UDT как правильно реализовать INullable  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Добрый день.

Изучаю c#, пытаюсь реализовать UDT:
+ тестовый г-код
public class UDTParams : INullable, IBinarySerialize
{
  private Dictionary<string,string> FParamList;

  public UDTParams() 
  {
    FParamList = new Dictionary<string, string>();
  }

  public bool IsNull { get { return (FParamList.Count==0); } }

  public static UDTParams Null
  {
    get
    {
      UDTParams h = new UDTParams();
      return h;
    }
  }
  // ------
  public override string ToString()
  {
    if (FParamList.Count <= 0)
      return string.Empty;

    StringBuilder s = new StringBuilder();
    foreach (KeyValuePair<string, string> p in FParamList)
    {
      s.Append((s.Length == 0 ? "" : string.Format("\r")) + p.Key + ':' + p.Value);
    }

    return s.ToString();
  }

  public static UDTParams Parse(SqlString s)
  {
    UDTParams u = new UDTParams();

    if ((!s.IsNull) && (s.Value != ""))
    {
      string[] str = s.ToString().Split(new string[] { "\r", "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
      for (Int32 i=0; i<str.Length; i++)
      {
        Int32 idx = str[i].IndexOf(":");
        u.FParamList.Add( str[i].Substring(0, idx), str[i].Substring(idx+1,str[i].Length-idx-1) );
      }
    }

    return u;
  }

  // ---------------  IBinarySerialize
  public void Write(System.IO.BinaryWriter w)
  {
    foreach (KeyValuePair<string, string> p in FParamList)
    {
      w.Write(p.Key);
      w.Write(p.Value);
    }
  }

  public void Read(System.IO.BinaryReader r)
  {
    while (r.BaseStream.Position < r.BaseStream.Length)
    {
      FParamList.Add(r.ReadString(), r.ReadString());
    }
  }
  // -----
  [SqlMethod(IsMutator = true, OnNullCall = true)]
  public void Clear() { FParamList.Clear(); }
}

Планирую использовать UDT в качестве поля таблицы => очень хочется NULL_ов
+ НО возникли непонятные мне грабельки:
declare @p UDTParams
set @p = UDTParams::Parse('Key:Value' + char(13) + 'Key_2:Value_2')
select @p.ToString(), CASE WHEN @p is null THEN 'ISNULL' ELSE 'NOT NULL' END
/* Select выдает правильный результат:
Key:Value
Key_2:Value_2	NOT NULL
*/
set @p.Clear()
/* ERROR !!!
Msg 5303, Level 16, State 1, Line 4
The result of applying mutator 'Clear' on CLR type '@p' cannot be a null value.
*/

Что не так ?

PS. Если в IsNull всегда возвращать false, то все работает, но NULL_ов, естественно, нет.

Ошибка мне понятна, непонятно как тогда добиться NULL_ов ?
28 май 15, 12:38    [17700806]     Ответить | Цитировать Сообщить модератору
 Re: CLR UDT как правильно реализовать INullable  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9169
Greenhorn,

Вам на форум по С#.
28 май 15, 13:28    [17701185]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить