Esercitazione: Progettare di un database relazionale nel database SQL di Azure con C# e ADO.NET

Si applica a: Database SQL di Azure

Il database SQL di Azure è un database relazionale distribuito come servizio in Microsoft Cloud (Azure). In questa esercitazione viene illustrato come usare il portale di Azure e ADO.NET con Visual Studio per eseguire queste operazioni:

  • Creare un database usando il portale di Azure
  • Configurare una regola del firewall IP a livello di server con il portale di Azure
  • Connettersi al database con ADO.NET e Visual Studio
  • Creare tabelle con ADO.NET
  • Inserire, aggiornare ed eliminare dati con ADO.NET
  • Eseguire query sui dati con ADO.NET

Suggerimento

Questo modulo gratuito di Learn contiene informazioni su come sviluppare e configurare un'applicazione ASP.NET che esegue query su un database SQL di Azure, inclusa la creazione di un database semplice.

Prerequisiti

Accedere al portale di Azure

Accedere al portale di Azure.

Creare una regola del firewall IP a livello di server

Database SQL crea un firewall per gli indirizzi IP a livello di server. Questo impedisce alle applicazioni e agli strumenti esterni di connettersi al server e ai database nel server a meno che una regola del firewall non consenta allo specifico indirizzo IP di superare il firewall. Per abilitare la connettività esterna al database, è prima di tutto necessario aggiungere una regola del firewall IP per l'indirizzo IP o l'intervallo di indirizzi IP. Per creare una regola del firewall IP a livello di server, seguire questa procedura.

Importante

Il database SQL comunica attraverso la porta 1433. Se si intende connettersi a questo servizio da una rete aziendale, il firewall della rete potrebbe non consentire il traffico in uscita sulla porta 1433. In questo caso, non è possibile connettersi al database a meno che l'amministratore non apra la porta 1433.

  1. Al termine della distribuzione, selezinare Database SQL nel menu a sinistra e quindi selezionare yourDatabase nella pagina Database SQL. Verrà visualizzata la pagina di panoramica del database, che mostra il nome server completo, ad esempio yourserver.database.windows.net, e offre opzioni per operazioni di configurazione aggiuntive.

  2. Copiare il nome completo del server per usarlo per la connessione al server e ai database da SQL Server Management Studio.

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

  3. Selezionare Rete in Impostazioni. Scegliere la scheda Accesso pubblico e quindi selezionare Reti selezionate in Accesso alla rete pubblica per visualizzare la sezione Regole del firewall.

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

  4. Selezionare Aggiungi IP client sulla barra degli strumenti per aggiungere l'indirizzo IP corrente a una nuova regola del firewall IP. Una regola del firewall per gli indirizzi IP può aprire la porta 1433 per un singolo indirizzo IP o un intervallo di indirizzi IP.

  5. Seleziona Salva. Viene creata una regola del firewall IP a livello di server per l'indirizzo IP corrente, che apre la porta 1433 nel server.

  6. Selezionare OK e quindi chiudere la pagina Impostazioni del firewall.

L'indirizzo IP può ora superare il firewall per gli indirizzi IP. È quindi possibile connettersi al database usando SQL Server Management Studio o un altro strumento di propria scelta. Assicurarsi di usare l'account amministratore del server creato in precedenza.

Importante

Per impostazione predefinita, l'accesso attraverso il firewall per gli indirizzi IP di Database SQL è abilitato per tutti i servizi di Azure. Selezionare NO in questa pagina per disabilitare l’accesso a tutti i servizi di Azure.

Esempio di programma C#

Le sezioni successive di questo articolo presentano un programma C# che usa ADO.NET per inviare istruzioni Transact-SQL (T-SQL) al database SQL. Il programma C# dimostra le azioni seguenti:

Diagramma entità-relazione

Le istruzioni CREATE TABLE usano la parola chiave REFERENCES per creare una relazione chiavi esterne tra le due tabelle. Se si usa tempdb, impostare come commento la parola chiave --REFERENCES usando una coppia di trattini iniziali.

Il diagramma entità-relazione mostra la relazione tra le due tabelle. I valori nella colonna tabEmployee.DepartmentCodefiglio sono limitati ai valori presenti nella colonna tabDepartment.DepartmentCodepadre.

ERD showing foreign key

Nota

È possibile modificare il codice T-SQL per aggiungere un carattere # davanti ai nomi di tabella, in modo da crearle come tabelle temporanee in tempdb. Ciò risulta utile per finalità dimostrative, quando non sono disponibili database di test. Qualsiasi riferimento alle chiavi esterne non viene applicato durante l'uso e le tabelle temporanee vengono eliminate automaticamente alla chiusura della connessione dopo che il programma termina l'esecuzione.

Per la compilazione e l'esecuzione

Il programma C# è logicamente un unico file con estensione cs ed è suddiviso fisicamente in diversi blocchi di codice, in modo da semplificare la comprensione di ogni blocco. Per compilare ed eseguire il programma, seguire questa procedura:

  1. Creare un progetto C# in Visual Studio. Il tipo di progetto deve essere un'applicazione console, da un elemento simile alla gerarchia seguente: Modelli>Visual C#>Desktop classico di Windows>App console (.NET Framework).

  2. Nel file Program.cs sostituire le righe iniziali del codice con i passaggi seguenti:

    1. Copiare e incollare i blocchi di codice seguenti nella stessa sequenza in cui sono visualizzati; vedere Connettersi al database, Generare T-SQL e Inviare al database.

    2. Modificare i valori seguenti nel metodo Main:

      • cb.DataSource
      • cb.UserID
      • cb.Password
      • cb.InitialCatalog
  3. Verificare che sia presente un riferimento all'assembly System.Data.dll. Per la verifica, espandere il nodo Riferimenti nel riquadro Esplora soluzioni.

  4. Per compilare ed eseguire il programma da Visual Studio, selezionare il pulsante Start. L'output del report viene visualizzato in una finestra del programma, anche se i valori GUID variano tra le esecuzioni dei test.

    =================================
    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...
    

Connessione al database SQL con 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();
        }

Metodi che restituiscono istruzioni 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;
    ";
}

Inviare T-SQL al database

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
}

Suggerimento

Per altre informazioni sulla scrittura di query SQL, consultare Esercitazione: Scrivere istruzioni Transact-SQL.

Passaggio successivo

Passare all'esercitazione successiva per informazioni sulla migrazione di dati.