/// <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(); } } }
/// <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 + "' не существует в БД."); } }
/// <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 + "' уже существует в БД."); } }
/// <summary> /// Удаляем таблицу /// </summary> /// <param name="module">модуль</param> public void DeleteTable(ModuleMetadata module) { _database.Tables[module.ModuleName].Drop(); }
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); } }