public DBObjectDistributedTable GetDistributedTable(DBObjectTableSchemaAdapter schemaAdapter, string tableName)//DBConnection connection, string tableName) { if (schemaAdapter == null) { throw new ArgumentNullException("schemaAdapter"); } if (String.IsNullOrEmpty(tableName)) { throw new ArgumentNullException("tableName"); } DBConnection connection = schemaAdapter.PrimaryDatabaseConnection; string tableKey = string.Format("{0}.{1}.{2}", connection.DisplayName.ToLower(), schemaAdapter.ClassDefinition.TypeUniqueKey, tableName); this.Logger.WriteFormatMessage("Получение распределенной таблицы. Ключ: '{0}'", tableKey); DBObjectDistributedTable table = null; if (DBObjectTableActivator.TablesByKey.ContainsKey(tableKey)) { table = DBObjectTableActivator.TablesByKey[tableKey]; } else { if (!DBObjectTableActivator.LockObjects.ContainsKey(tableKey)) { lock (DBObjectTableActivator.LokersLocker) { if (!DBObjectTableActivator.LockObjects.ContainsKey(tableKey)) { DBObjectTableActivator.LockObjects.Add(tableKey, new object()); } } } lock (DBObjectTableActivator.LockObjects[tableKey]) { if (!DBObjectTableActivator.TablesByKey.ContainsKey(tableKey)) { this.Logger.WriteFormatMessage("Вызов конструктора объекта таблицы. Ключ: '{0}'", tableKey); table = new DBObjectDistributedTable(schemaAdapter, tableName); if (!table.TablePartition.Table.Exists) { throw new DistributedTableNotFoundException(connection.DisplayName, tableName); } } else { table = DBObjectTableActivator.TablesByKey[tableKey]; } } } this.Logger.WriteFormatMessage("Получение распределенной таблицы завершено. Ключ: '{0}'", tableKey); return(table); }
/// <summary> /// Добавляет новый объект в базу данных. /// </summary> /// <param name="metadataObject">Объект метаданных.</param> /// <param name="tableName">Название таблицы</param> /// <returns></returns> protected int InsertObject(T metadataObject) { if (metadataObject == null) { throw new ArgumentNullException("metadataObject"); } //идентификатор созданного объекта. int createdID = 0; string tableName = this.GetTableName(metadataObject); if (String.IsNullOrEmpty(tableName)) { throw new Exception(String.Format("Не удалось определить конечную таблицу для объекта {0} типа {1}", metadataObject.ToString(), metadataObject.GetType().Name)); } DBObjectDistributedTable table = this.MetadataAdapter.TableActivator.EnsureDistributedTable(this.DBSchemaAdapter, tableName); MetadataQueryBuilder queryBuilder = new MetadataQueryBuilder(table.TablePartition.Table, this.TypeDefinition); string insertQuery = @" {InsertQuery} SELECT SCOPE_IDENTITY() AS CreatedID, @@ROWCOUNT AS AffectedRowsCount" .ReplaceKey("InsertQuery", queryBuilder.InsertQuery); DBCollection <SqlParameter> insertParams = this.CreateInsertParameters(metadataObject); DataRow insertResult = this.DataAdapter.GetDataRow(insertQuery, insertParams.ToArray()); if (insertResult == null) { throw new Exception(string.Format("Не удалось получить результат создания объекта.")); } DataRowReader insertResultReader = new DataRowReader(insertResult); int affectedRowsCount = insertResultReader.GetIntegerValue("AffectedRowsCount"); //если объект по заданному условию уже существовал, устанавливаем идентификатор созданного элемента равный -1. if (affectedRowsCount == 0) { createdID = -1; } //проставляем свойства созданного списка else { createdID = insertResultReader.GetIntegerValue("CreatedID"); if (createdID == 0) { throw new Exception("Не удалось получить идентификатор созданного объекта."); } } //возвращаем идентификатор созданного объекта. return(createdID); }
/// <summary> /// Обновляет существующий объект в базе данных. /// </summary> /// <param name="metadataObject">Объект метаданных.</param> /// <returns></returns> protected bool UpdateObject(T metadataObject) { if (metadataObject == null) { throw new ArgumentNullException("metadataObject"); } string tableName = this.GetTableName(metadataObject); if (String.IsNullOrEmpty(tableName)) { throw new Exception(String.Format("Не удалось определить конечную таблицу для объекта {0} типа {1}", metadataObject.ToString(), metadataObject.GetType().Name)); } DBObjectDistributedTable table = this.MetadataAdapter.TableActivator.GetDistributedTable(this.DBSchemaAdapter, tableName); MetadataQueryBuilder queryBuilder = new MetadataQueryBuilder(table.TablePartition.Table, this.TypeDefinition); //приводим объект к типу метаданных. IMetadataObject metadata = this.GetMetadataObject(metadataObject); if (metadata.ID == 0) { throw new ArgumentNullException("metadata.ID", "Не передан идентификатор объекта."); } //формируем условие обновления объекта по идентификатору. string identityCondition = string.Format("[ID] = {1}", table.TablePartition.Table.IdentityColumn.Name, metadata.ID); //запрос обновления объекта метаданных. string updateQuery = @" {UpdateQuery} WHERE {IdentityCondition} SELECT @@ROWCOUNT" .ReplaceKey("UpdateQuery", queryBuilder.UpdateQuery) .ReplaceKey("IdentityCondition", identityCondition) ; //формируем параметры обновления, соответствующие значениям свойств объекта. DBCollection <SqlParameter> updateParams = this.CreateInsertParameters(metadataObject); //выполняем запрос. int affectedRowsCount = this.DataAdapter.GetScalarValue <int>(updateQuery, updateParams.ToArray()); return(affectedRowsCount > 0); }
public DBObjectDistributedTable EnsureDistributedTable(DBObjectTableSchemaAdapter schemaAdapter, string tableName) { if (schemaAdapter == null) { throw new ArgumentNullException("schemaAdapter"); } if (String.IsNullOrEmpty(tableName)) { throw new ArgumentNullException("tableName"); } DBConnection connection = schemaAdapter.PrimaryDatabaseConnection; string tableKey = string.Format("{0}.{1}.{2}", connection.DisplayName.ToLower(), schemaAdapter.ClassDefinition.TypeUniqueKey, tableName); DBObjectDistributedTable table = null; this.Logger.WriteFormatMessage("Получение/создание распределенной таблицы. Ключ: '{0}'", tableKey); if (!DBObjectTableActivator.TablesByKey.ContainsKey(tableKey)) { if (!DBObjectTableActivator.LockObjects.ContainsKey(tableKey)) { lock (DBObjectTableActivator.LokersLocker) { if (!DBObjectTableActivator.LockObjects.ContainsKey(tableKey)) { DBObjectTableActivator.LockObjects.Add(tableKey, new object()); } } } lock (DBObjectTableActivator.LockObjects[tableKey]) { if (!DBObjectTableActivator.TablesByKey.ContainsKey(tableKey)) { this.Logger.WriteFormatMessage("Вызов конструктора объекта таблицы. Ключ: '{0}'", tableKey); table = new DBObjectDistributedTable(schemaAdapter, tableName); this.Logger.WriteFormatMessage("Инициализация объекта таблицы. Ключ: '{0}'", tableKey); table.TablePartition.Table.Init(); this.Logger.WriteFormatMessage("Инициализация объекта таблицы завершена. Ключ: '{0}'", tableKey); lock (DBObjectTableActivator.LokersLocker) { DBObjectTableActivator.TablesByKey.Add(tableKey, table); } } else { table = DBObjectTableActivator.TablesByKey[tableKey]; } } } else { table = DBObjectTableActivator.TablesByKey[tableKey]; } if (table == null) { throw new Exception(string.Format("Не удалось получить таблицу файлов, с названием {0}.", tableName)); } this.Logger.WriteFormatMessage("Получение/создание распределенной таблицы завершено. Ключ: '{0}'", tableKey); return(table); }