public ColumnInfo(string columnName, StorageStructForView.PropStorage propStorage) { ColumnName = columnName; PropStorages = new List <StorageStructForView.PropStorage> { propStorage }; }
/// <summary> /// Этот метод переопределён, чтобы создать словарь соответствия длинных и коротких имён для псевдонимов. /// </summary> /// <param name="storageStruct"> /// The storage Struct. /// </param> /// <param name="addNotMainKeys"> /// The add Not Main Keys. /// </param> /// <param name="addMasterFieldsCustomizer"> /// The add Master Fields Customizer. /// </param> /// <param name="AddingAdvansedField"> /// The Adding Advansed Field. /// </param> /// <param name="AddingKeysCount"> /// The Adding Keys Count. /// </param> /// <param name="SelectTypesIds"> /// The Select Types Ids. /// </param> /// <returns> /// The <see cref="string"/>. /// </returns> public override string GenerateSQLSelectByStorageStruct( StorageStructForView storageStruct, bool addNotMainKeys, bool addMasterFieldsCustomizer, string AddingAdvansedField, int AddingKeysCount, bool SelectTypesIds) { StorageStructForView.PropSource source = storageStruct.sources; foreach (StorageStructForView.PropSource subSource in source.LinckedStorages) { for (int j = 0; j < subSource.storage.Length; j++) { string curAlias = subSource.Name + j; GenerateShortName(curAlias); } } for (int i = 0; i < storageStruct.props.Length; i++) { StorageStructForView.PropStorage prop = storageStruct.props[i]; if (prop.MultipleProp) { continue; } bool propStored = prop.Stored; if (propStored && (string.IsNullOrEmpty(prop.Expression) || this.IsExpressionContainAttrubuteCheckOnly(prop.Expression))) { if (prop.MastersTypesCount > 0) { string deniedAccessValue = string.Empty; bool isAccessDenied = SecurityManager.UseRightsOnAttribute && !SecurityManager.CheckAccessToAttribute( prop.Expression, out deniedAccessValue); for (int j = 0; j < prop.storage.Length; j++) { for (int k = 0; k < prop.MastersTypes[j].Length; k++) { string curName = isAccessDenied ? deniedAccessValue : prop.source.Name + j; GenerateShortName(curName); } } } else { for (int j = 0; j < prop.storage.Length; j++) { GenerateShortName(prop.source.Name + j); } } } } return(base.GenerateSQLSelectByStorageStruct(storageStruct, addNotMainKeys, addMasterFieldsCustomizer, AddingAdvansedField, AddingKeysCount, SelectTypesIds)); }
/// <summary> /// Добавляет в таблицу новые строки с заполненными данными для указанной структуры /// </summary> /// <param name="dt">Таблица, в которую добавляются строки.</param> /// <param name="storageStruct">Структура хранения на основе которой будут добавлять строки.</param> /// <param name="columnsInfo">Информация о колонках для определения, что и в какие колонки записывать.</param> /// <param name="structIndex"> /// Номер структуры. /// Необходим для того, чтобы достать настройки из информации о колонках. /// Если необходимо заполнить таблицу одним массивом данных и структура была одна, то необходимо передать 0. /// </param> private void FillDataTable(DataTable dt, StorageStructForView storageStruct, List <ColumnInfo> columnsInfo, int structIndex) { DataTable mainDataTable = _dataSet.Tables[storageStruct.sources.storage[0].Storage]; int startRowsIndex = dt.Rows.Count; // Добавляем столько строк, сколько их в таблице основного объекта данных for (int i = 0; i < mainDataTable.Rows.Count; i++) { dt.Rows.Add(dt.NewRow()); } // В этот список будут записаны мастеровые таблицы после соединения. var masterTables = new Dictionary <StorageStructForView.PropSource, DataTable>(); SetAllMasterTables(storageStruct.sources, mainDataTable, masterTables); // Далее заполняем таблицу по ячейкам. foreach (var columnInfo in columnsInfo) { StorageStructForView.PropStorage propStorage = columnInfo.PropStorages == null ? null : columnInfo.PropStorages[structIndex]; StorageStructForView.PropSource propSource = columnInfo.PropSources == null ? null : columnInfo.PropSources[structIndex]; // Если это свойство хранимое if (propStorage != null && propStorage.Stored && !columnInfo.IsStormDataObjectType && !columnInfo.IsStormJoinedMasterKey && !columnInfo.IsStormMainObjectKey) { // Если это свойство является собственным для основного объекта данных, то ищем в основной таблице. if (propSource == storageStruct.sources) { for (int i = 0; i < mainDataTable.Rows.Count; i++) { dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = mainDataTable.Rows[i][propStorage.Name]; } } else if (masterTables.ContainsKey(propSource)) { // иначе это свойство мастера и надо брать его из таблицы мастеров после соединения for (int i = 0; i < mainDataTable.Rows.Count; i++) { dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = masterTables[propSource].Rows[i][propStorage.simpleName]; } } } else { if (columnInfo.IsStormMainObjectKey) { // в эту колонку записываются первичные ключи основного объекта данных for (int i = 0; i < mainDataTable.Rows.Count; i++) { dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = mainDataTable.Rows[i][storageStruct.sources.storage[0].PrimaryKeyStorageName]; } } else if (columnInfo.IsStormDataObjectType) { // В эту колонку записывается номер типа для загрузки данных. // Он необходим когда читаются наследники через базовый класс. for (int i = 0; i < mainDataTable.Rows.Count; i++) { dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = structIndex; } } else if (columnInfo.IsStormJoinedMasterKey) { // если этот мастер был указан в представлении, то его можно вытянуть через PropStorage string simpleName = propStorage != null ? propStorage.simpleName : propSource.storage[0].PrimaryKeyStorageName; // в эти колонки записываются первичные ключи мастеров for (int i = 0; i < mainDataTable.Rows.Count; i++) { // Ключ мастера храниться в таблице мастера if (masterTables.ContainsKey(propSource)) { dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = masterTables[propSource].Rows[i][simpleName]; } else { // или его можно взять сразу из таблицы основного объекта данных dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = mainDataTable.Rows[i][simpleName]; } } } } } }
/// <summary> /// Заполнить объект данных. /// </summary> /// <param name="dobject">Объект данных.</param> /// <param name="values">Значения для заполнения.</param> /// <param name="storageStruct">Метаданные структуры хранения.</param> /// <param name="customizationStruct">Настройка выборки данных.</param> /// <param name="typesByKeys">Служебная структура, увязывающая типы мастеров и их ключи.</param> /// <param name="advCols">Дополнительные колонки.</param> /// <param name="dataObjectCache">Кэш объектов данных.</param> /// <param name="securityManager">Менеджер полномочий.</param> public static void FillRowSetToDataObject(DataObject dobject, object[] values, StorageStructForView storageStruct, LoadingCustomizationStruct customizationStruct, System.Collections.SortedList typesByKeys, AdvansedColumn[] advCols, DataObjectCache dataObjectCache, ISecurityManager securityManager) { Type dobjectType = dobject.GetType(); /* access type */ if (!securityManager.AccessObjectCheck(dobjectType, tTypeAccess.Full, false)) { securityManager.AccessObjectCheck(dobjectType, tTypeAccess.Read, true); } /* access type */ // Заливаем данные в объект данных. int customizationStructViewPropertiesLength = customizationStruct.View.Properties.Length; int advColsLength = advCols.Length; Information.SetPropValueByName(dobject, "__PrimaryKey", values[customizationStructViewPropertiesLength + advColsLength]); // 1. создаем структуру мастеров(свойств-объектов данных). System.Collections.SortedList assList = new System.Collections.SortedList(); int index = customizationStructViewPropertiesLength + 1 + advColsLength; CreateMastersStruct(dobject, values, ref index, 0, storageStruct.sources, assList, typesByKeys, dataObjectCache); assList.Add(storageStruct.sources, new object[] { dobject, 0 }); // 2. заливаем данные. System.Collections.ArrayList properiesValues = new System.Collections.ArrayList(); StringCollection allAdvCols = new StringCollection(); int masterPosition = index; for (int i = 0; i < advColsLength; i++) { object value = values[i + customizationStructViewPropertiesLength]; if (value == DBNull.Value) { value = null; } properiesValues.Add(new[] { advCols[i].Name, value, dobject }); allAdvCols.Add(advCols[i].Name); dobject.DynamicProperties.Add(advCols[i].Name, null); } for (int i = 0; i < customizationStructViewPropertiesLength; i++) { StorageStructForView.PropStorage prop = storageStruct.props[i]; if (Information.IsStoredProperty(dobjectType, prop.Name) || prop.Expression != null) { if (prop.MastersTypes == null) { object[] tmp = (object[])assList[prop.source]; object value; if (customizationStruct.ColumnsOrder != null && customizationStruct.ColumnsOrder.Length >= customizationStructViewPropertiesLength) { value = values[Array.IndexOf(customizationStruct.ColumnsOrder, prop.Name)]; } else { value = values[i]; } if (value == DBNull.Value) { value = null; } if (tmp != null) { properiesValues.Add( new[] { prop.simpleName, value, tmp[0] }); } } else { object[] tmp = (object[])assList[prop.source]; if (tmp != null) { // Ищем позицию. int tmp1 = (int)tmp[1]; int curMasterPosition = masterPosition; for (int j = 0; j < tmp1; j++) { curMasterPosition += prop.MastersTypes[j].Length; } int k = 0; object value = values[curMasterPosition]; if (value == DBNull.Value) { value = null; } while (k < prop.MastersTypes[tmp1].Length - 1 && value == null) { k++; value = values[curMasterPosition + k]; if (value == DBNull.Value) { value = null; } } object tmp0 = tmp[0]; if (value != null) { if (Information.GetPropValueByName((DataObject)tmp0, prop.simpleName) == null) { DataObject no = dataObjectCache.CreateDataObject(prop.MastersTypes[tmp1][k], value); if (no.GetStatus(false) == ObjectStatus.Created) { no.SetStatus(ObjectStatus.UnAltered); no.SetLoadingState(LoadingState.LightLoaded); no.InitDataCopy(dataObjectCache); } value = no; properiesValues.Add(new[] { prop.simpleName, value, tmp0 }); } else { // changed by fat properiesValues.Add(new[] { prop.simpleName, Information.GetPropValueByName((DataObject)tmp0, prop.simpleName), tmp0 }); } } else { properiesValues.Add(new[] { prop.simpleName, null, tmp0 }); } } masterPosition += prop.MastersTypesCount; } } } // 2.2 Записываем в объекты. System.Collections.SortedList curObjProperiesValues = new System.Collections.SortedList(); while (properiesValues.Count > 0) { // a. Выбираем для текущего объекта все свойства. object[] tmp = (object[])properiesValues[0]; DataObject curobj = (DataObject)tmp[2]; dobjectType = curobj.GetType(); curObjProperiesValues.Clear(); List <string> loadedPropsColl = curobj.GetLoadedPropertiesList(); for (int i = properiesValues.Count - 1; i >= 0; i--) { tmp = (object[])properiesValues[i]; if (tmp[2] == curobj) { object tmp0 = tmp[0]; if (!curObjProperiesValues.ContainsKey(tmp0)) { curObjProperiesValues.Add(tmp0, tmp[1]); if (!loadedPropsColl.Contains((string)tmp0)) { loadedPropsColl.Add((string)tmp0); } } properiesValues.RemoveAt(i); } } // b. Раскидываем согласно LoadOrder; string[] loadOrder = Information.GetLoadingOrder(dobjectType); int loadOrderLength = loadOrder.Length; for (int i = 0; i < loadOrderLength; i++) { string propName = loadOrder[i]; if (curObjProperiesValues.ContainsKey(propName)) { Information.SetPropValueByName(curobj, propName, curObjProperiesValues[propName]); curObjProperiesValues.Remove(propName); } } int curObjPropertiesValuesCount = curObjProperiesValues.Count; for (int i = 0; i < curObjPropertiesValuesCount; i++) { Information.SetPropValueByName(curobj, (string)curObjProperiesValues.GetKey(i), curObjProperiesValues.GetByIndex(i)); } if (loadedPropsColl.Count >= Information.GetAllPropertyNames(dobjectType).Length) { curobj.SetLoadingState(LoadingState.Loaded); } else { curobj.SetLoadingState(LoadingState.LightLoaded); curobj.AddLoadedProperties(loadedPropsColl); } curobj.SetStatus(ObjectStatus.UnAltered); } }