Esercitazione: Progettare un database relazionale in un database singolo in Database SQL di Azure con C# e ADO.NETTutorial: Design a relational database in a single database within Azure SQL Database C# and ADO.NET

Il database SQL di Azure è un database relazionale distribuito come servizio in Microsoft Cloud (Azure).Azure SQL Database is a relational database-as-a-service (DBaaS) in the Microsoft Cloud (Azure). In questa esercitazione viene illustrato come usare il portale di Azure e ADO.NET con Visual Studio per eseguire queste operazioni:In this tutorial, you learn how to use the Azure portal and ADO.NET with Visual Studio to:

  • Creare un database singolo con il portale di Azure*Create a single database using the Azure portal*
  • Configurare una regola del firewall per gli indirizzi IP a livello di server con il portale di AzureSet up a server-level IP firewall rule using the Azure portal
  • Connettersi al database con ADO.NET e Visual StudioConnect to the database with ADO.NET and Visual Studio
  • Creare tabelle con ADO.NETCreate tables with ADO.NET
  • Inserire, aggiornare ed eliminare dati con ADO.NETInsert, update, and delete data with ADO.NET
  • Eseguire query sui dati con ADO.NETQuery data ADO.NET

*Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.*If you don't have an Azure subscription, create a free account before you begin.

Suggerimento

Il modulo gratuito seguente di Microsoft 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.The following Microsoft Learn module helps you learn for free how to Develop and configure an ASP.NET application that queries an Azure SQL Database, including the creation of a simple database.

PrerequisitiPrerequisites

Installazione di Visual Studio 2019 o versioni successive.An installation of Visual Studio 2019 or later.

Creare un database singolo vuotoCreate a blank single database

Un database singolo in Database SQL di Azure viene creato con un set definito di risorse di calcolo e di archiviazione.A single database in Azure SQL Database is created with a defined set of compute and storage resources. Il database viene creato in un gruppo di risorse di Azure e viene gestito usando un server di database.The database is created within an Azure resource group and is managed using an database server.

Per creare un database singolo vuoto, seguire questa procedura.Follow these steps to create a blank single database.

  1. Fare clic su Crea una risorsa nell'angolo superiore sinistro del portale di Azure.Click Create a resource in the upper left-hand corner of the Azure portal.

  2. Nella pagina Nuovo, selezionare Database nella sezione Azure Marketplace e quindi fare clic su Database SQL nella sezione In primo piano.On the New page, select Databases in the Azure Marketplace section, and then click SQL Database in the Featured section.

    creare database vuoto

  3. Compilare il modulo Database SQL con le informazioni seguenti, come illustrato nell'immagine precedente:Fill out the SQL Database form with the following information, as shown on the preceding image:

    ImpostazioneSetting       Valore consigliatoSuggested value DescrizioneDescription
    Nome databaseDatabase name yourDatabaseyourDatabase Per informazioni sui nomi di database validi, vedere Identificatori del database.For valid database names, see Database identifiers.
    SottoscrizioneSubscription yourSubscriptionyourSubscription Per informazioni dettagliate sulle sottoscrizioni, vedere Sottoscrizioni.For details about your subscriptions, see Subscriptions.
    Gruppo di risorseResource group yourResourceGroupyourResourceGroup Per i nomi di gruppi di risorse validi, vedere Regole di denominazione e restrizioni.For valid resource group names, see Naming rules and restrictions.
    Select source (Seleziona origine)Select source Database vuotoBlank database Indica che deve essere creato un database vuoto.Specifies that a blank database should be created.
  4. Fare clic su Server per usare un server di database esistente oppure crearne e configurarne uno nuovo.Click Server to use an existing database server or create and configure a new database server. Selezionare un server esistente oppure fare clic su Crea un nuovo server e compilare il modulo Nuovo server con le informazioni seguenti:Either select an existing server or click Create a new server and fill out the New server form with the following information:

    ImpostazioneSetting       Valore consigliatoSuggested value DescrizioneDescription
    Nome serverServer name Qualsiasi nome globalmente univocoAny globally unique name Per i nomi di server validi, vedere Regole di denominazione e restrizioni.For valid server names, see Naming rules and restrictions.
    Accesso amministratore serverServer admin login Qualsiasi nome validoAny valid name Per informazioni sui nomi di accesso validi, vedere Identificatori del database.For valid login names, see Database identifiers.
    PasswordPassword Qualsiasi password validaAny valid password La password deve contenere almeno otto caratteri delle tre categorie seguenti: maiuscole, minuscole, numeri e caratteri non alfanumerici.Your password must have at least eight characters and must use characters from three of the following categories: upper case characters, lower case characters, numbers, and non-alphanumeric characters.
    PosizioneLocation Qualsiasi località validaAny valid location Per informazioni sulle aree, vedere Aree di Azure.For information about regions, see Azure Regions.

    Creare il server di database

  5. Fare clic su Seleziona.Click Select.

  6. Fare clic su Piano tariffario per specificare il livello di servizio, il numero di DTU o vCores e la quantità di risorse di archiviazione.Click Pricing tier to specify the service tier, the number of DTUs or vCores, and the amount of storage. Esplorare le opzioni relative al numero di DTU/vCore e di risorse di archiviazione disponibile per ogni livello di servizio.You may explore the options for the number of DTUs/vCores and storage that is available to you for each service tier.

    Dopo aver selezionato il livello di servizio, il numero di DTU o vCore e la quantità di spazio di archiviazione, fare clic su Applica.After selecting the service tier, the number of DTUs or vCores, and the amount of storage, click Apply.

  7. Immettere le regole di confronto per il database vuoto. Per questa esercitazione usare il valore predefinito.Enter a Collation for the blank database (for this tutorial, use the default value). Per altre informazioni sulle regole di confronto, vedere Collations (Regole di confronto)For more information about collations, see Collations

  8. Dopo aver completato il modulo Database SQL, fare clic su Crea per effettuare il provisioning del database singolo.Now that you've completed the SQL Database form, click Create to provision the single database. Questo passaggio potrebbe richiedere alcuni minuti.This step may take a few minutes.

  9. Sulla barra degli strumenti fare clic su Notifiche per monitorare il processo di distribuzione.On the toolbar, click Notifications to monitor the deployment process.

    notifica

Creare una regola del firewall IP a livello di serverCreate a server-level IP firewall rule

Il servizio Database SQL crea un firewall per gli indirizzi IP a livello di server.The SQL Database service creates an IP firewall at the server-level. 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.This firewall prevents external applications and tools from connecting to the server and any databases on the server unless a firewall rule allows their IP through the firewall. Per abilitare la connettività esterna al database singolo, è prima di tutto necessario aggiungere una regola del firewall IP o l'intervallo di indirizzi IP.To enable external connectivity to your single database, you must first add an IP firewall rule for your IP address (or IP address range). Per creare una regola del firewall IP a livello di server di database SQL, seguire questa procedura.Follow these steps to create a SQL Database server-level IP firewall rule.

Importante

Il servizio Database SQL comunica sulla porta 1433.The SQL Database service communicates over port 1433. Se si intende connettersi al servizio da una rete aziendale, il firewall della rete potrebbe non consentire il traffico in uscita sulla porta 1433.If you are trying to connect to this service from within a corporate network, outbound traffic over port 1433 may not be allowed by your network's firewall. In questo caso, non è possibile connettersi al database singolo a meno che l'amministratore non apra la porta 1433.If so, you cannot connect to your single database unless your administrator opens port 1433.

  1. Al termine della distribuzione, fare clic su Database SQL nel menu a sinistra e quindi su yourDatabase nella pagina Database SQL.After the deployment completes, click SQL databases from the left-hand menu and then click yourDatabase on the SQL databases page. 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.The overview page for your database opens, showing you the fully qualified Server name (such as yourserver.database.windows.net) and provides options for further configuration.

  2. Copiare il nome completo del server per usarlo per la connessione al server e ai database da SQL Server Management Studio.Copy this fully qualified server name for use to connect to your server and databases from SQL Server Management Studio.

    Nome del server

  3. Fare clic su Imposta firewall server sulla barra degli strumenti.Click Set server firewall on the toolbar. Si apre la pagina Impostazioni del firewall per il server di database SQL.The Firewall settings page for the SQL Database server opens.

    regola del firewall IP a livello di server

  4. Fare clic su Aggiungi IP client sulla barra degli strumenti per aggiungere l'indirizzo IP corrente a una nuova regola del firewall per gli indirizzi IP.Click Add client IP on the toolbar to add your current IP address to a new IP firewall rule. Una regola del firewall per gli indirizzi IP può aprire la porta 1433 per un singolo indirizzo IP o un intervallo di indirizzi IP.An IP firewall rule can open port 1433 for a single IP address or a range of IP addresses.

  5. Fare clic su Save.Click Save. Viene creata una regola del firewall IP a livello di server per l'indirizzo IP corrente, che apre la porta 1433 nel server di database SQL.A server-level IP firewall rule is created for your current IP address opening port 1433 on the SQL Database server.

  6. Fare clic su OK e quindi chiudere la pagina Impostazioni del firewall.Click OK and then close the Firewall settings page.

L'indirizzo IP può ora superare il firewall per gli indirizzi IP.Your IP address can now pass through the IP firewall. È quindi possibile connettersi al database singolo usando SQL Server Management Studio o un altro strumento di propria scelta.You can now connect to your single database using SQL Server Management Studio or another tool of your choice. Assicurarsi di usare l'account amministratore del server creato in precedenza.Be sure to use the server admin account you created previously.

Importante

Per impostazione predefinita, l'accesso attraverso il firewall per gli indirizzi IP di Database SQL è abilitato per tutti i servizi di Azure.By default, access through the SQL Database IP firewall is enabled for all Azure services. Selezionando NO in questa pagina permette di disabilitare tutti i servizi di Azure.Click OFF on this page to disable for all Azure services.

Esempio di programma C#C# program example

Le sezioni successive di questo articolo presentano un programma C# che usa ADO.NET per inviare istruzioni Transact-SQL (T-SQL) al database SQL.The next sections of this article present a C# program that uses ADO.NET to send Transact-SQL (T-SQL) statements to the SQL database. Il programma C# dimostra le azioni seguenti:The C# program demonstrates the following actions:

Diagramma entità-relazioneEntity Relationship Diagram (ERD)

Le istruzioni CREATE TABLE usano la parola chiave REFERENCES per creare una relazione chiavi esterne tra le due tabelle.The CREATE TABLE statements involve the REFERENCES keyword to create a foreign key (FK) relationship between two tables. Se si usa tempdb, impostare come commento la parola chiave --REFERENCES usando una coppia di trattini iniziali.If you're using tempdb, comment out the --REFERENCES keyword using a pair of leading dashes.

Il diagramma entità-relazione mostra la relazione tra le due tabelle.The ERD displays the relationship between the two tables. I valori nella colonna tabEmployee.DepartmentCode figlio sono limitati ai valori presenti nella colonna tabDepartment.DepartmentCode padre.The values in the tabEmployee.DepartmentCode child column are limited to values from the tabDepartment.DepartmentCode parent column.

Diagramma entità-relazione che mostra una chiave esterna

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.You have the option of editing the T-SQL to add a leading # to the table names, which creates them as temporary tables in tempdb. Ciò risulta utile per finalità dimostrative, quando non sono disponibili database di test.This is useful for demonstration purposes, when no test database is available. 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.Any reference to foreign keys are not enforced during their use and temporary tables are deleted automatically when the connection closes after the program finishes running.

Per la compilazione e l'esecuzioneTo compile and run

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.The C# program is logically one .cs file, and is physically divided into several code blocks, to make each block easier to understand. Per compilare ed eseguire il programma, seguire questa procedura:To compile and run the program, do the following steps:

  1. Creare un progetto C# in Visual Studio.Create a C# project 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) .The project type should be a Console, found under Templates > Visual C# > Windows Desktop > Console App (.NET Framework).

  2. Nel file Program.cs sostituire le righe iniziali del codice con i passaggi seguenti:In the file Program.cs, replace the starter lines of code with the following steps:

    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.Copy and paste the following code blocks, in the same sequence they're presented, see Connect to database, Generate T-SQL, and Submit to database.

    2. Modificare i valori seguenti nel metodo Main:Change the following values in the Main method:

      • cb.DataSourcecb.DataSource
      • cb.UserIDcb.UserID
      • cb.Passwordcb.Password
      • cb.InitialCatalogcb.InitialCatalog
  3. Verificare che sia presente un riferimento all'assembly System.Data.dll.Verify the assembly System.Data.dll is referenced. Per la verifica, espandere il nodo Riferimenti nel riquadro Esplora soluzioni.To verify, expand the References node in the Solution Explorer pane.

  4. Per compilare ed eseguire il programma da Visual Studio, selezionare il pulsante Start.To build and run the program from Visual Studio, select the Start button. L'output del report viene visualizzato in una finestra del programma, anche se i valori GUID variano tra le esecuzioni dei test.The report output is displayed in a program window, though GUID values will vary between test runs.

    =================================
    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.NETConnect to SQL database using 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-SQLMethods that return T-SQL statements

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 databaseSubmit T-SQL to the 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
}

Passaggi successiviNext steps

Questa esercitazione ha illustrato le attività di base che è possibile eseguire con i database, ad esempio creare database e tabelle, connettersi al database, caricare dati ed eseguire query.In this tutorial, you learned basic database tasks such as create a database and tables, connect to the database, load data, and run queries. Si è appreso come:You learned how to:

  • Creare un databaseCreate a database
  • Configurare una regola del firewallSet up a firewall rule
  • Connettersi al database con Visual Studio e C#Connect to the database with Visual Studio and C#
  • Creare tabelleCreate tables
  • Inserire, aggiornare ed eliminare dati ed eseguire query su di essiInsert, update, delete, and query data

Passare all'esercitazione successiva per informazioni sulla migrazione di dati.Advance to the next tutorial to learn about data migration.