Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        protected int InsertObject(T metadataObject)
        {
            //идентификатор созданного объекта.
            int createdID = 0;

            string insertQuery = @"
            {InsertQuery}
            SELECT SCOPE_IDENTITY() AS CreatedID, @@ROWCOUNT AS AffectedRowsCount"
                                 .ReplaceKey("InsertQuery", this.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);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Возвращает коллекцию папок репликации.
        /// </summary>
        /// <param name="condition">Условие на выборку метаданных.</param>
        /// <returns></returns>
        internal DBCollection <ReplicationFolderMetadata> GetReplicationFolders(string condition = null)
        {
            DBCollection <ReplicationFolderMetadata> replicationFolders = new DBCollection <ReplicationFolderMetadata>();
            string resultQuery = null;

            if (string.IsNullOrEmpty(condition))
            {
                resultQuery = this.SelectQuery;
            }
            else
            {
                resultQuery = @"{SelectQuery} WHERE {Condition}"
                              .ReplaceKey("SelectQuery", this.SelectQuery)
                              .ReplaceKey("Condition", condition);
            }

            DataTable resultTable = this.DataAdapter.GetDataTable(resultQuery);

            if (resultTable != null)
            {
                //собираем все идентификаторы папок и узлов хранилища
                //чтобы получить их за отдельный запрос
                Dictionary <int, FolderMetadata>  uniqueFolders  = new Dictionary <int, FolderMetadata>();
                Dictionary <int, StorageMetadata> uniqueStorages = new Dictionary <int, StorageMetadata>();

                //сначала заполняем ключи словарей
                foreach (DataRow row in resultTable.Rows)
                {
                    int folderID = DataRowReader.GetIntegerValue(row, "FolderID");
                    if (folderID > 0 && !uniqueFolders.ContainsKey(folderID))
                    {
                        uniqueFolders.Add(folderID, null);
                    }


                    int storageID = DataRowReader.GetIntegerValue(row, "StorageID");
                    if (storageID > 0 && !uniqueStorages.ContainsKey(storageID))
                    {
                        uniqueStorages.Add(storageID, null);
                    }
                }

                //потом получаем объекты по этим ключам и "дозаполняем" словарь
                if (uniqueFolders.Count > 0)
                {
                    string foldersIdentities = string.Join(",", uniqueFolders.Keys.ToArray());
                    string foldersCondition  = string.Format("[ID] IN ({0})", foldersIdentities);
                    DBCollection <FolderMetadata> folders = this.MetadataAdapter.FolderAdapter.GetFolders(foldersCondition);

                    foreach (FolderMetadata folder in folders)
                    {
                        if (uniqueFolders.ContainsKey(folder.ID))
                        {
                            uniqueFolders[folder.ID] = folder;
                        }
                    }
                }

                if (uniqueStorages.Count > 0)
                {
                    string storagesIdentities = string.Join(",", uniqueStorages.Keys.ToArray());
                    string storagesCondition  = string.Format("[ID] IN ({0})", storagesIdentities);

                    DBCollection <StorageMetadata> storages = this.MetadataAdapter.StorageAdapter.GetStorages(storagesCondition);
                    foreach (StorageMetadata storage in storages)
                    {
                        if (uniqueStorages.ContainsKey(storage.ID))
                        {
                            uniqueStorages[storage.ID] = storage;
                        }
                    }
                }

                foreach (DataRow row in resultTable.Rows)
                {
                    FolderMetadata  folder  = null;
                    StorageMetadata storage = null;

                    int folderID = DataRowReader.GetIntegerValue(row, "FolderID");
                    if (folderID > 0 && uniqueFolders.ContainsKey(folderID))
                    {
                        folder = uniqueFolders[folderID];
                    }


                    int storageID = DataRowReader.GetIntegerValue(row, "StorageID");
                    if (storageID > 0 && uniqueStorages.ContainsKey(storageID))
                    {
                        storage = uniqueStorages[storageID];
                    }

                    if (folder == null)
                    {
                        int rowID = DataRowReader.GetIntegerValue(row, "ID");
                        throw new Exception(string.Format("Для строки метаданных папки репликации с идентификатором {0} не найдена папка с идентификатором {1}",
                                                          rowID,
                                                          folderID));
                    }

                    if (storage == null)
                    {
                        int rowID = DataRowReader.GetIntegerValue(row, "ID");
                        throw new Exception(string.Format("Для строки метаданных папки репликации с идентификатором {0} не найден узел хранилища с идентификатором {1}",
                                                          rowID,
                                                          storageID));
                    }

                    ReplicationFolderMetadata metadata = new ReplicationFolderMetadata(row, folder, storage);
                    replicationFolders.Add(metadata);
                }
            }

            return(replicationFolders);
        }
Ejemplo n.º 4
0
 public int GetIntegerValue(string columnName, int defaultValue)
 {
     int typedValue = DataRowReader.GetIntegerValue(this.Row, columnName, defaultValue);
     return typedValue;
 }
Ejemplo n.º 5
0
 public static int GetIntegerValue(DataRow row, string columnName)
 {
     return DataRowReader.GetIntegerValue(row, columnName, 0);
 }