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

Aplica-se a:Banco de Dados SQL do Azure

O Banco de Dados SQL do Azure é um banco de dados relacional como serviço (DBaaS) no Microsoft Cloud (Azure). Neste tutorial, vai aprender a utilizar 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 IP no nível do servidor usando o portal do Azure
  • Ligar à base de dados com o ADO.NET e o Visual Studio
  • Criar tabelas com o ADO.NET
  • Inserir, atualizar e eliminar os dados com o ADO.NET
  • Consultar dados com o ADO.NET

Gorjeta

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

Inicie sessão no portal do Azure

Inicie sessão no portal do Azure.

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

O Banco de dados SQL cria um firewall IP no nível do servidor. Esse firewall impede que aplicativos e ferramentas externos se conectem ao servidor e a quaisquer bancos de dados no servidor, a menos que uma regra de firewall permita seu IP através do firewall. Para habilitar a conectividade externa ao seu banco de dados, você deve primeiro adicionar uma regra de firewall IP para seu endereço IP (ou intervalo de endereços IP). Siga estas etapas para criar uma regra de firewall IP no nível do servidor.

Importante

A Base de Dados SQL comunica através da porta 1433. Se estiver a tentar ligar-se a este serviço a partir de uma rede empresarial, o tráfego de saída através da porta 1433 poderá não ser permitido pela firewall da rede. Em caso afirmativo, você não poderá se conectar ao banco de dados, a menos que o administrador abra a porta 1433.

  1. Após a conclusão da implantação, selecione bancos de dados SQL no menu à esquerda e, em seguida, selecione yourDatabase na página Bancos de dados SQL. A página de visão geral do banco de dados é aberta, mostrando o nome do servidor totalmente qualificado (como yourserver.database.windows.net) e fornece opções para configuração adicional.

  2. Copie esse nome de servidor totalmente qualificado para uso para se conectar ao servidor e aos 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, em seguida, 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 IP . Uma regra de firewall IP pode abrir a porta 1433 para um único endereço IP ou um intervalo de endereços IP.

  5. Selecione Guardar. Uma regra de firewall IP no nível do servidor é criada para o seu endereço IP atual abrindo a porta 1433 no servidor.

  6. Selecione OK e feche a página Configurações do firewall .

O seu endereço IP pode agora passar através da firewall IP. Agora você pode se conectar ao seu banco de dados usando o SQL Server Management Studio ou outra ferramenta de sua escolha. Certifique-se de usar a conta de administrador do servidor que você criou anteriormente.

Importante

Por padrão, o acesso por meio do firewall IP do Banco de Dados SQL está habilitado para todos os serviços do Azure. Selecione DESATIVADO 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 ADO.NET para enviar instruções Transact-SQL (T-SQL) para o Banco de dados SQL. O programa C# demonstra as seguintes ações:

Diagrama de Relacionamento de Entidade (ERD)

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

O ERD exibe a relação entre as duas tabelas. Os valores na coluna filho tabEmployee.DepartmentCode são limitados aos valores da coluna pai tabDepartment.DepartmentCode.

ERD showing foreign key

Nota

Você tem a opção de editar o T-SQL para adicionar uma entrelinha # aos nomes das tabelas, o que as cria como tabelas temporárias no 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 é imposta durante o seu uso e as tabelas temporárias são excluídas automaticamente quando a conexão é fechada após a conclusão da execução do programa.

Para compilar e executar

O programa C# é logicamente um arquivo .cs, e é fisicamente dividido em vários blocos de código, para tornar cada bloco mais fácil de entender. Para compilar e executar o programa, execute as seguintes etapas:

  1. Crie um projeto C# no Visual Studio. O tipo de projeto deve ser um Console, encontrado em Templates>Visual C#>Windows Desktop>Console App (.NET Framework).

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

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

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

      • cb. Fonte de dados
      • cb. ID de utilizador
      • cb. Palavra-passe
      • cb. Catálogo Inicial
  3. Verifique se o assembly System.Data.dll está referenciado. Para verificar, expanda o nó Referências no painel Gerenciador de Soluções.

  4. Para criar e executar o programa a partir do Visual Studio, selecione o botão Iniciar . A saída do relatório é exibida em uma janela do 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 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 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
}

Gorjeta

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

Próximo passo

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