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

Aplica-se a: do 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, você aprenderá a usar o portal do Azure e 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
  • Conectar-se ao banco de dados com o ADO.NET e o Visual Studio
  • Criar tabelas com ADO.NET
  • Inserir, atualizar e excluir dados com ADO.NET
  • Consultar dados ADO.NET

Dica

Este módulo gratuito do Learn mostra como desenvolver e configurar uma aplicação ASP.NET que consulta uma base de dados SQL do Azure, incluindo a criação de uma base de dados simples.

Pré-requisitos

Entre 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 de nível de servidor .

Importante

O Banco de dados SQL se comunica pela 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 de bancos de dados SQL. A página de visão geral do banco de dados é aberta, mostrando o de nome do Server 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.

    Captura de ecrã do portal do Azure, página de descrição geral da base de dados, com o nome do servidor realçado.

  3. No portal do Azure, navegue até o servidor SQL lógico do Banco de Dados SQL do Azure. A maneira mais fácil é selecionar o valor do nome do Servidor na página Banco de Dados SQL.

  4. No menu de recursos, em Configurações, selecione Rede.

  5. Escolha o separador [Acesso Público] e, em seguida, selecione [Redes selecionadas] em [Acesso à rede pública].

    Captura de ecrã do portal do Azure, página Rede, mostrando que o acesso à rede pública está ativado.

  6. Role para baixo até a seção regras do Firewall.

    Captura de ecrã do portal do Azure, página Rede, secção Regras de firewall.

  7. Selecione Adicionar o endereço IPv4 do cliente para adicionar o 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.

  8. Selecione Salvar. Uma regra de firewall IP ao nível do servidor é criada para o seu endereço IP atual, que abre a porta 1433 no servidor.

  9. 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 OFF 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 instruções CREATE TABLE envolvem a palavra-chave REFERENCES para criar uma relação de chave estrangeira (FK) entre duas tabelas. Se você estiver usando 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 na coluna tabEmployee.DepartmentCodefilho são limitados aos valores da coluna tabDepartment.DepartmentCode pai.

ERD mostrando chave estrangeira

Observação

Você tem a opção de editar o T-SQL para adicionar um # no início dos nomes das tabelas, o que as 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 é 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, GerarT-SQL e Enviar para o banco de dados.

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

      • cb.FonteDeDados
      • cb. ID de utilizador
      • cb. Palavra-passe
      • cb.InitialCatalog
  3. Verifique se a montagem System.Data.dll está referenciada. 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
}

Dica

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.