/// <summary> /// Присвоение нового значения атрибуту /// </summary> /// <param name="order">Порядок следования атрибута в списке атрибутов</param> /// <param name="value">Новое значение атрибута</param> public void SetAttrValue(int order, object value) { if (order >= this._factdata.Count) { throw new Exception(string.Format("Нет атрибута с номером {0} !", order)); } _factdata[order] = new AttrFactData(_factdata[order].Type, value); _bytedata = null; MakeBlob(); }
/// <summary> /// Конструктор - создание Blob из двоичных данных (После чтения из БД) /// </summary> /// <param name="attrTypes">Список типов атрибутов блоков</param> /// <param name="data">массив байт</param> public Blob(List <enAttrTypes> attrTypes, byte[] data) : this(data, attrTypes.Count) { _factdata = new List <AttrFactData>(); if (data == null) { foreach (var type in attrTypes) { var attrfactdata = new AttrFactData(type, null); _factdata.Add(attrfactdata); } } else { ParseBlob(attrTypes); } }
/// <summary> /// Разбор Блоба из БД на значения атрибутов и заполнение Словаря /// </summary> protected void ParseBlob(List <enAttrTypes> _attrTypes) { if (_bytedata == null || _bytedata.Length == 0 || _attrTypes == null) { return; } const int intlen = 4; // количество байт для хранения Int const int boolen = 1; // количество байт для хранения bool const int lnglen = 8; // количество байт для хранения адреса byte[] arrbt; AttrFactData attrfactdata; int offset = 0; // Текущая позиция чтения в _bytedata object value = null; foreach (var type in _attrTypes) { value = null; // Читаем значение IsNull arrbt = new byte[boolen]; for (int i = 0; i < boolen; i++) { arrbt[i] = _bytedata[offset++]; } if (BitConverter.IsLittleEndian) { Array.Reverse(arrbt); } var IsNull = BitConverter.ToBoolean(arrbt, 0); if (!IsNull) { switch (type) { case enAttrTypes.mntxt: case enAttrTypes.mnrtf: // Определяем длину текста arrbt = new byte[intlen]; for (int i = 0; i < intlen; i++) { arrbt[i] = _bytedata[offset++]; } if (BitConverter.IsLittleEndian) { Array.Reverse(arrbt); } var txtlen = BitConverter.ToInt32(arrbt, 0); // Чтение текста arrbt = new byte[txtlen]; for (int i = 0; i < txtlen; i++) { arrbt[i] = _bytedata[offset++]; } if (BitConverter.IsLittleEndian) { Array.Reverse(arrbt); } value = Encoding.UTF8.GetString(arrbt); break; case enAttrTypes.mnlink: case enAttrTypes.mnlong: arrbt = new byte[lnglen]; for (int i = 0; i < lnglen; i++) { arrbt[i] = _bytedata[offset++]; } if (BitConverter.IsLittleEndian) { Array.Reverse(arrbt); } value = BitConverter.ToInt64(arrbt, 0); break; case enAttrTypes.mnreal: arrbt = new byte[lnglen]; for (int i = 0; i < lnglen; i++) { arrbt[i] = _bytedata[offset++]; } if (BitConverter.IsLittleEndian) { Array.Reverse(arrbt); } value = BitConverter.ToSingle(arrbt, 0); break; case enAttrTypes.mnbool: arrbt = new byte[boolen]; for (int i = 0; i < boolen; i++) { arrbt[i] = _bytedata[offset++]; } if (BitConverter.IsLittleEndian) { Array.Reverse(arrbt); } value = BitConverter.ToBoolean(arrbt, 0); break; case enAttrTypes.mnblob: // Определяем длину массива байт картинки arrbt = new byte[intlen]; for (int i = 0; i < intlen; i++) { arrbt[i] = _bytedata[offset++]; } if (BitConverter.IsLittleEndian) { Array.Reverse(arrbt); } var imglen = BitConverter.ToInt32(arrbt, 0); // Чтение массива байт картинки arrbt = new byte[imglen]; for (int i = 0; i < imglen; i++) { arrbt[i] = _bytedata[offset++]; } if (BitConverter.IsLittleEndian) { Array.Reverse(arrbt); } //value = TMorph.Common.Utils.GetImageFromByteArray(arrbt); using (var ms = new MemoryStream(arrbt)) { value = Image.FromStream(ms, true); } break; case enAttrTypes.mnarr: // Определяем длину списка ссылок arrbt = new byte[intlen]; for (int i = 0; i < intlen; i++) { arrbt[i] = _bytedata[offset++]; } if (BitConverter.IsLittleEndian) { Array.Reverse(arrbt); } var listlen = BitConverter.ToInt32(arrbt, 0); // Чтение списка var lst = new List <long>(); arrbt = new byte[lnglen]; for (int i = 0; i < listlen; i++) { for (int j = 0; j < lnglen; j++) { arrbt[j] = _bytedata[offset++]; } if (BitConverter.IsLittleEndian) { Array.Reverse(arrbt); } lst.Add(BitConverter.ToInt64(arrbt, 0)); } value = lst; break; } } attrfactdata = new AttrFactData(type, value); _factdata.Add(attrfactdata); } }
public AttrFactData(enAttrTypes _type, object _value) { this = new AttrFactData(); this.Type = _type; this.Value = _value; }