Пример #1
0
        /// <summary>
        /// Создаём модуль
        /// </summary>
        /// <param name="module">модуль</param>
        public void CreateModule(ModuleMetadata module)
        {
            //
            //  Открывам соединение и создаем транзакцию для создания
            //  физическйо таблицы
            //
            _context.Connection.Open();
            using (System.Data.Common.DbTransaction transaction = _context.Connection.BeginTransaction())
            {
                try
                {
                    _context.AddToModuleMetadataSet(module);
                    _context.SaveChanges();

                    _dbManager.CreateTableFromModuleSchema(module);

                    transaction.Commit();
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                }
                finally
                {
                    _context.Connection.Close();
                }
            }
        }
Пример #2
0
 /// <summary>
 /// Изменяем структуру таблицы
 /// </summary>
 /// <param name="module"></param>
 public void AlterTable(ModuleMetadata module)
 {
     if (_database.Tables.Contains(module.ModuleName))
     {
         try
         {
             //  создаём таблицу
             Table targetTable = _database.Tables[module.ModuleName];
             targetTable.Drop();
             CreateTableFromModuleSchema(module);
         }
         catch (Microsoft.SqlServer.Management.Smo.InvalidSmoOperationException)
         {
             throw;
         }
     }
     else
     {
         throw new InvalidOperationException("Таблицs с именем '" + module.ModuleName + "' не существует в БД.");
     }
 }
Пример #3
0
        /// <summary>
        /// Создаём таблицу из схемы модуля
        /// </summary>
        /// <param name="module">Метаданные модуля</param>
        public void CreateTableFromModuleSchema(ModuleMetadata module)
        {
            if (!_database.Tables.Contains(module.ModuleName))
            {
                try
                {
                    //  создаём таблицу
                    Table targetTable = new Table(_database, module.ModuleName);

                    //
                    //  добавляем базовые столбцы в таблицу
                    //
                    #region Внешниый ключ
                    Column plowMachineIdColumn = new Column(targetTable, "PlowMachineId");
                    plowMachineIdColumn.DataType = DataType.UniqueIdentifier;
                    plowMachineIdColumn.RowGuidCol = true;
                    plowMachineIdColumn.Nullable = false;

                    ForeignKey fk = new ForeignKey(targetTable, "FK_" + module.ModuleName + "_PlowMachine");
                    ForeignKeyColumn fk_column = new ForeignKeyColumn(fk, "PlowMachineId");
                    fk_column.ReferencedColumn = "PlowMachineId";
                    fk.ReferencedTable = "PlowMachines";
                    fk.Columns.Add(fk_column);

                    targetTable.ForeignKeys.Add(fk);
                    targetTable.Columns.Add(plowMachineIdColumn);
                    #endregion

                    //
                    //  добавляем столбцы в таблицу
                    //
                    foreach (FieldMetadata f in module.MetadataFields)
                    {
                        Column column = CreateColumn(targetTable, f);
                        targetTable.Columns.Add(column);
                    }

                    targetTable.Create();

                    #region Первичный ключ

                    Index idx = new Index(targetTable, "PK_" + module.ModuleName);
                    IndexedColumn idxc = new IndexedColumn(idx, plowMachineIdColumn.Name);
                    idx.IndexedColumns.Add(idxc);
                    idx.IndexKeyType = IndexKeyType.DriPrimaryKey;
                    idx.IsClustered = true;
                    idx.IsUnique = true;
                    idx.Create();

                    #endregion
                }
                catch (Microsoft.SqlServer.Management.Smo.InvalidSmoOperationException)
                {
                    throw;
                }

            }
            else
            {
                throw new InvalidOperationException("Таблица с именем '" + module.ModuleName + "' уже существует в БД.");
            }
        }
Пример #4
0
 /// <summary>
 /// Удаляем таблицу
 /// </summary>
 /// <param name="module">модуль</param>
 public void DeleteTable(ModuleMetadata module)
 {
     _database.Tables[module.ModuleName].Drop();
 }
Пример #5
0
        private void btnCreate_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder();
                bldr.DataSource = cmbbxSqlServer.SelectedValue.ToString();
                bldr.InitialCatalog = cmbbxDatabase.SelectedItem.ToString();
                bldr.IntegratedSecurity = true;
                bldr.MultipleActiveResultSets = true;

                using (SqlConnection connection = new SqlConnection(bldr.ConnectionString))
                {
                    SqlCommand cmd = connection.CreateCommand();
                    cmd.CommandText = "SELECT * FROM " + cmbbxTables.SelectedItem.ToString();

                    //
                    //  схема столбцов выбранной таблицы
                    //
                    connection.Open();
                    DataTable schema = null;
                    using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly))
                    {
                        schema = reader.GetSchemaTable();
                    }

                    //
                    //  создаем модуль в СУ
                    //
                    using (MetadataManager manager = new MetadataManager())
                    {
                        ModuleMetadata metadata = new ModuleMetadata();
                        metadata.ModuleName = txbxModuleName.Text;

                        foreach (DataRow column in schema.Rows)
                        {
                            FieldMetadata f = new FieldMetadata();
                            f.FieldName = (string)column[0];            //  название столбца
                            f.ClrType = ((Type)column[12]).FullName;    //  тип в Clr

                            if (IsExist(f.FieldName))
                            {
                                throw new InvalidOperationException("Поле '" + f.FieldName + "' уже существует.");
                            }

                            f.Description = GetFieldDescription(f.FieldName, connection);

                            metadata.MetadataFields.Add(f);
                        }

                        manager.CreateModule(metadata);

                        //  если все прошло удачно
                        MessageBox.Show("Готово.", "Операция завершена успешно", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException != null ? ex.InnerException.Message : ex.Message, "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }