Tutorial: Criar um banco de dados relacional em um Banco de Dados SQL do Azure em C# e ADO.NET

Aplica-se a:Banco de Dados SQL do Azure

O Banco de Dados SQL do Azure é um DBaaS (banco de dados como serviço) no Microsoft Cloud (Azure). Neste tutorial, você aprenderá a usar o portal do Azure e o ADO.NET com o Visual Studio para:

  • Criar um banco de dados usando o portal do Azure
  • Configurar uma regra de firewall de IP de nível de servidor usando o portal do Azure
  • Conecte-se ao banco de dados com o ADO.NET e o Visual Studio
  • Criar tabelas com o ADO.NET
  • Inserir, atualizar e excluir dados com o ADO.NET
  • Consultar ADO.NET de dados

Dica

Este módulo gratuito do Learn mostra como Desenvolver e configurar um aplicativo ASP.NET que consulta um Banco de Dados SQL do Azure, incluindo a criação de um banco de dados simples.

Pré-requisitos

Entre no Portal do Azure

Entre no portal do Azure.

Criar uma regra de firewall de IP no nível do servidor

O Banco de Dados SQL cria um firewall de IP no nível do servidor. Esse firewall impede que os aplicativos e ferramentas externos se conectem ao servidor e aos bancos de dados no servidor, a menos que uma regra de firewall permita seu IP por meio do firewall. Para habilitar a conectividade externa com seu banco de dados, primeiro adicione uma regra de firewall de IP ao seu endereço IP (ou intervalo de endereços IP). Siga estas etapas para criar uma regra de firewall de IP no nível do servidor.

Importante

O Banco de Dados SQL se comunica pela porta 1433. Se você estiver tentando se conectar a esse serviço de dentro de uma rede corporativa, o tráfego de saída pela porta 1433 poderá não ser permitido pelo firewall da sua rede. Se isso acontecer, você não poderá conectar-se ao banco de dados, a menos que o administrador abra a porta 1433.

  1. Depois da implantação ser concluída, escolha Bancos de Dados SQL no menu à esquerda e selecione yourDatabase na página Bancos de Dados SQL. A página de visão geral de seu banco de dados é aberta, mostrando o nome do servidor totalmente qualificado (como yourserver.database.windows.net) e fornece opções para configurações adicionais.

  2. Copie esse nome totalmente qualificado do servidor para usá-lo para se conectar ao seu servidor e bancos de dados do SQL Server Management Studio.

    Screenshot of the Azure portal, database overview page, with the server name highlighted.

  3. Selecione Rede em Configurações. Escolha a guia Acesso Público e selecione Redes selecionadas em Acesso à rede pública para exibir a seção Regras de firewall.

    Screenshot of the Azure portal, networking page, showing where to set the server-level IP firewall rule.

  4. Selecione Adicionar IP do cliente na barra de ferramentas para adicionar seu endereço IP atual a uma nova regra de firewall de IP. Uma regra de firewall de IP pode abrir a porta 1433 para um único endereço IP ou um intervalo de endereços IP.

  5. Clique em Salvar. Uma regra de firewall de IP no nível do servidor é criada para o endereço IP atual que abre a porta 1433 no servidor.

  6. Selecione OK e, em seguida, feche a página Configurações do Firewall.

Agora seu endereço IP pode passar pelo firewall de IP. Agora, é possível se conectar ao seu banco de dados usando o SQL Server Management Studio ou outra ferramenta de sua escolha. Use a conta do administrador do servidor criada anteriormente.

Importante

Por padrão, o acesso por meio do firewall de IP do Banco de Dados SQL é habilitado para todos os serviços do Azure. Selecione DESATIVAR nesta página para desabilitar o acesso a todos os serviços do Azure.

Exemplo de programa em C#

As próximas seções deste artigo apresentam um programa C# que usa o ADO.NET para enviar instruções T-SQL (Transact-SQL) para o Banco de Dados SQL. O programa C# demonstra as seguintes ações:

Diagrama de relação de entidade (ERD)

As instruções CREATE TABLE envolvem a palavra-chave REFERÊNCIAS para criar uma relação de FK (chave estrangeira) entre duas tabelas. Se você estiver usando o tempdb, comente a palavra-chave --REFERENCES usando um par de traços à esquerda.

O ERD exibe a relação entre as duas tabelas. Os valores da coluna filhotabEmployee.DepartmentCode são limitados aos valores presentes na coluna paitabDepartment.DepartmentCode.

ERD showing foreign key

Observação

Você tem a opção de editar a T-SQL para adicionar um líder # aos nomes de tabela, que cria como tabelas temporárias em tempdb. Isso é útil para fins de demonstração, quando nenhum banco de dados de teste está disponível. Qualquer referência a chaves estrangeiras não são impostas durante seu uso e tabelas temporárias são excluídas automaticamente quando a conexão é fechada depois que o programa é encerrado.

Para compilar e executar

O programa C# é logicamente um arquivo .cs e é dividido fisicamente em vários blocos de código para facilitar a compreensão de cada bloco. Para compilar e executar o programa, execute as seguintes etapas:

  1. Crie um novo projeto em C# no Visual Studio. O tipo de projeto deve ser um Console, localizado em Modelos>Visual C#>Windows Desktop>Aplicativo de Console (.NET Framework) .

  2. No arquivo Program.cs, substitua as linhas iniciais do código com as seguintes etapas:

    1. Copie e cole os blocos de código a seguir, na mesma sequência em que são apresentados. Confira Conectar-se ao banco de dados, Gerar T-SQL e Enviar para o banco de dados.

    2. Altere os seguintes valores no método Main:

      • cb.DataSource
      • cb.UserID
      • cb.Password
      • cb.InitialCatalog
  3. Verifique se o assembly System.Data.dll é referenciado. Para verificar, expanda o nó Referências no painel Gerenciador de Soluções.

  4. Para criar e executar o programa do Visual Studio, selecione o botão Iniciar. A saída de relatório é exibida em uma janela de programa, embora os valores de GUID variem entre as execuções de teste.

    =================================
    T-SQL to 2 - Create-Tables...
    -1 = rows affected.
    
    =================================
    T-SQL to 3 - Inserts...
    8 = rows affected.
    
    =================================
    T-SQL to 4 - Update-Join...
    2 = rows affected.
    
    =================================
    T-SQL to 5 - Delete-Join...
    2 = rows affected.
    
    =================================
    Now, SelectEmployees (6)...
    8ddeb8f5-9584-4afe-b7ef-d6bdca02bd35 , Alison , 20 , acct , Accounting
    9ce11981-e674-42f7-928b-6cc004079b03 , Barbara , 17 , hres , Human Resources
    315f5230-ec94-4edd-9b1c-dd45fbb61ee7 , Carol , 22 , acct , Accounting
    fcf4840a-8be3-43f7-a319-52304bf0f48d , Elle , 15 , NULL , NULL
    View the report output here, then press any key to end the program...
    

Conectar-se ao Banco de Dados SQL usando o ADO.NET

using System;
using System.Data.SqlClient;   // System.Data.dll
//using System.Data;           // For:  SqlDbType , ParameterDirection

namespace csharp_db_test
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var cb = new SqlConnectionStringBuilder();
                cb.DataSource = "your_server.database.windows.net";
                cb.UserID = "your_user";
                cb.Password = "your_password";
                cb.InitialCatalog = "your_database";

                using (var connection = new SqlConnection(cb.ConnectionString))
                {
                    connection.Open();

                    Submit_Tsql_NonQuery(connection, "2 - Create-Tables", Build_2_Tsql_CreateTables());

                    Submit_Tsql_NonQuery(connection, "3 - Inserts", Build_3_Tsql_Inserts());

                    Submit_Tsql_NonQuery(connection, "4 - Update-Join", Build_4_Tsql_UpdateJoin(),
                        "@csharpParmDepartmentName", "Accounting");

                    Submit_Tsql_NonQuery(connection, "5 - Delete-Join", Build_5_Tsql_DeleteJoin(),
                        "@csharpParmDepartmentName", "Legal");

                    Submit_6_Tsql_SelectEmployees(connection);
                }
            }
            catch (SqlException e)
            {
                Console.WriteLine(e.ToString());
            }

            Console.WriteLine("View the report output here, then press any key to end the program...");
            Console.ReadKey();
        }

Métodos que retornam instruções T-SQL

static string Build_2_Tsql_CreateTables()
{
    return @"
        DROP TABLE IF EXISTS tabEmployee;
        DROP TABLE IF EXISTS tabDepartment;  -- Drop parent table last.

        CREATE TABLE tabDepartment
        (
            DepartmentCode  nchar(4)          not null    PRIMARY KEY,
            DepartmentName  nvarchar(128)     not null
        );

        CREATE TABLE tabEmployee
        (
            EmployeeGuid    uniqueIdentifier  not null  default NewId()    PRIMARY KEY,
            EmployeeName    nvarchar(128)     not null,
            EmployeeLevel   int               not null,
            DepartmentCode  nchar(4)              null
            REFERENCES tabDepartment (DepartmentCode)  -- (REFERENCES would be disallowed on temporary tables.)
        );
    ";
}

static string Build_3_Tsql_Inserts()
{
    return @"
        -- The company has these departments.
        INSERT INTO tabDepartment (DepartmentCode, DepartmentName)
        VALUES
            ('acct', 'Accounting'),
            ('hres', 'Human Resources'),
            ('legl', 'Legal');

        -- The company has these employees, each in one department.
        INSERT INTO tabEmployee (EmployeeName, EmployeeLevel, DepartmentCode)
        VALUES
            ('Alison'  , 19, 'acct'),
            ('Barbara' , 17, 'hres'),
            ('Carol'   , 21, 'acct'),
            ('Deborah' , 24, 'legl'),
            ('Elle'    , 15, null);
    ";
}

static string Build_4_Tsql_UpdateJoin()
{
    return @"
        DECLARE @DName1  nvarchar(128) = @csharpParmDepartmentName;  --'Accounting';

        -- Promote everyone in one department (see @parm...).
        UPDATE empl
        SET
            empl.EmployeeLevel += 1
        FROM
            tabEmployee   as empl
        INNER JOIN
            tabDepartment as dept ON dept.DepartmentCode = empl.DepartmentCode
        WHERE
            dept.DepartmentName = @DName1;
    ";
}

static string Build_5_Tsql_DeleteJoin()
{
    return @"
        DECLARE @DName2  nvarchar(128);
        SET @DName2 = @csharpParmDepartmentName;  --'Legal';

        -- Right size the Legal department.
        DELETE empl
        FROM
            tabEmployee   as empl
        INNER JOIN
            tabDepartment as dept ON dept.DepartmentCode = empl.DepartmentCode
        WHERE
            dept.DepartmentName = @DName2

        -- Disband the Legal department.
        DELETE tabDepartment
            WHERE DepartmentName = @DName2;
    ";
}

static string Build_6_Tsql_SelectEmployees()
{
    return @"
        -- Look at all the final Employees.
        SELECT
            empl.EmployeeGuid,
            empl.EmployeeName,
            empl.EmployeeLevel,
            empl.DepartmentCode,
            dept.DepartmentName
        FROM
            tabEmployee   as empl
        LEFT OUTER JOIN
            tabDepartment as dept ON dept.DepartmentCode = empl.DepartmentCode
        ORDER BY
            EmployeeName;
    ";
}

Enviar o T-SQL para o banco de dados

static void Submit_6_Tsql_SelectEmployees(SqlConnection connection)
{
    Console.WriteLine();
    Console.WriteLine("=================================");
    Console.WriteLine("Now, SelectEmployees (6)...");

    string tsql = Build_6_Tsql_SelectEmployees();

    using (var command = new SqlCommand(tsql, connection))
    {
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                Console.WriteLine("{0} , {1} , {2} , {3} , {4}",
                    reader.GetGuid(0),
                    reader.GetString(1),
                    reader.GetInt32(2),
                    (reader.IsDBNull(3)) ? "NULL" : reader.GetString(3),
                    (reader.IsDBNull(4)) ? "NULL" : reader.GetString(4));
            }
        }
    }
}

static void Submit_Tsql_NonQuery(
    SqlConnection connection,
    string tsqlPurpose,
    string tsqlSourceCode,
    string parameterName = null,
    string parameterValue = null
    )
{
    Console.WriteLine();
    Console.WriteLine("=================================");
    Console.WriteLine("T-SQL to {0}...", tsqlPurpose);

    using (var command = new SqlCommand(tsqlSourceCode, connection))
    {
        if (parameterName != null)
        {
            command.Parameters.AddWithValue(  // Or, use SqlParameter class.
                parameterName,
                parameterValue);
        }
        int rowsAffected = command.ExecuteNonQuery();
        Console.WriteLine(rowsAffected + " = rows affected.");
    }
}
} // EndOfClass
}

Dica

Para saber mais sobre como escrever consultas SQL, visite o Tutorial: Escrever instruções Transact-SQL.

Próxima etapa

Avança para o próximo tutorial para saber mais sobre migração de dados.