Criando e manipulando Tabelas e Colunas no SQL Server com .NET

Mesmo se tratando de algo simples para ser feito com T-SQL, as bibliotecas do SMO permitem ao DBA/desenvolvedor uma forma transparente de criar e manipular objetos do SQL Server sem necessidade de uma linha de T-SQL.

Para um primeiro exemplo, vamos criar um banco de dados:

const string serverName = @".\SQLEXPRESS";

var server = new Server(serverName);

// CREATE DATABASE [Estoque]
var database = new Database(server, "Estoque");
database.Create();

Neste banco de dados, vamos criar uma tabela e suas colunas:

// CREATE TABLE [dbo].[Produto]
var table = new Table(database, "Produto", "dbo");

//   [Id] [int] IDENTITY(1,1) NOT NULL
table.Columns.Add(new Column(table, "Id", DataType.Int) { Nullable = false, Identity = true });

//   [Nome] [varchar](250) NOT NULL
table.Columns.Add(new Column(table, "Nome", DataType.VarChar(250)) { Nullable = false });

//   [Quantidade] [int] NOT NULL
table.Columns.Add(new Column(table, "Quantidade", DataType.Int) { Nullable = false });

//   [Valor] [money] NOT NULL
table.Columns.Add(new Column(table, "Valor", DataType.Money) { Nullable = false });

//   [Peso] [decimal](5, 2) NOT NULL
table.Columns.Add(new Column(table, "Peso", DataType.Decimal(2, 5)) { Nullable = false });

//   [Frete] [money] NULL
table.Columns.Add(new Column(table, "Frete", DataType.Money) { Nullable = true });

table.Create();

Nesta tabela, podemos remover colunas de forma bem simples:

// ALTER TABLE [dbo].[Produto]
//   DROP COLUMN [Frete]
table.Columns["Frete"].Drop();

Assim como adicionar uma Primary Key para a tabela:

// ALTER TABLE [dbo].[Produto]
//   ADD CONSTRAINT [PK_Produto] PRIMARY KEY ([Id])
var pk = new Index(table, "PK_Produto") { IndexKeyType = IndexKeyType.DriPrimaryKey };
pk.IndexedColumns.Add(new IndexedColumn(pk, "Id"));
pk.Create();

Ao se tratar de adicionar colunas em uma tabela, de duas formas isso poderá ser feito, sendo a primeira por meio o objeto Table e o método Alter:

// ALTER TABLE [dbo].[Produto]
//   ADD [CategoriaId] [int] NOT NULL
table.Columns.Add(new Column(table, "CategoriaId", DataType.Int) { Nullable = false });
table.Alter();

E a segunda forma, pelo objeto Column e o método Create:

// ALTER TABLE [dbo].[Produto]
//   ADD [DataCadastro] [datetime] NOT NULL
var col = new Column(table, "DataCadastro", DataType.DateTime) { Nullable = false };
col.Create();

Para apagar uma tabela ou até mesmo o banco de dados inteiro, podemos utilizar o método Drop do respectivo objeto a ser apagado:

// DROP TABLE [dbo].[Produto]
table.Drop();

// DROP DATABASE [dbo].[Estoque]
database.Drop();

Na próxima semana, veremos também como é possível criar Foreign Keys, Unique Keys, Default Constraints e Indexes com SMO.

Código completo:

using Microsoft.SqlServer.Management.Smo;

namespace DemoSmo
{
    static class DemoCreate1
    {
        static void Main()
        {
            const string serverName = @".\SQLEXPRESS";

            var server = new Server(serverName);

            // CREATE DATABASE [Estoque]
            var database = new Database(server, "Estoque");
            database.Create();

            // CREATE TABLE [dbo].[Produto]
            var table = new Table(database, "Produto", "dbo");

            //   [Id] [int] IDENTITY(1,1) NOT NULL
            table.Columns.Add(new Column(table, "Id", DataType.Int) { Nullable = false, Identity = true });

            //   [Nome] [varchar](250) NOT NULL
            table.Columns.Add(new Column(table, "Nome", DataType.VarChar(250)) { Nullable = false });

            //   [Quantidade] [int] NOT NULL
            table.Columns.Add(new Column(table, "Quantidade", DataType.Int) { Nullable = false });

            //   [Valor] [money] NOT NULL
            table.Columns.Add(new Column(table, "Valor", DataType.Money) { Nullable = false });

            //   [Peso] [decimal](5, 2) NOT NULL
            table.Columns.Add(new Column(table, "Peso", DataType.Decimal(2, 5)) { Nullable = false });

            //   [Frete] [money] NULL
            table.Columns.Add(new Column(table, "Frete", DataType.Money) { Nullable = true });

            table.Create();

            // ALTER TABLE [dbo].[Produto]
            //   DROP COLUMN [Frete]
            table.Columns["Frete"].Drop();

            // ALTER TABLE [dbo].[Produto]
            //   ADD CONSTRAINT [PK_Produto] PRIMARY KEY ([Id])
            var pk = new Index(table, "PK_Produto") { IndexKeyType = IndexKeyType.DriPrimaryKey };
            pk.IndexedColumns.Add(new IndexedColumn(pk, "Id"));
            pk.Create();

            // Criando colunas em tabelas já existentes:

            //// Forma #1
            // ALTER TABLE [dbo].[Produto]
            //   ADD [CategoriaId] [int] NOT NULL
            table.Columns.Add(new Column(table, "CategoriaId", DataType.Int) { Nullable = false });
            table.Alter();

            //// Forma #2
            // ALTER TABLE [dbo].[Produto]
            //   ADD [DataCadastro] [datetime] NOT NULL
            var col = new Column(table, "DataCadastro", DataType.DateTime) { Nullable = false };
            col.Create();

            // DROP TABLE [dbo].[Produto]
            table.Drop();

            // DROP DATABASE [dbo].[Estoque]
            database.Drop();
        }
    }
}
Anúncios

2 pensamentos sobre “Criando e manipulando Tabelas e Colunas no SQL Server com .NET

  1. Pingback: Criando Constraints e Índices no SQL Server com .NET « SQL From Hell.com

  2. Pingback: Trabalhando com SMO – Resumo « SQL From Hell.com

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s