Zelfstudie: Een relationele database ontwerpen in Azure SQL Database C# en ADO.NET

Van toepassing op: Azure SQL Database

Azure SQL Database is een relationele DBaaS (database-as-a-service) in Microsoft Cloud (Azure). In deze zelfstudie leert u hoe u Azure Portal en ADO.NET met Visual Studio gebruikt voor de volgende taken:

  • Een database maken met behulp van de Azure-portal
  • Een IP-firewallregel op serverniveau instellen met Azure Portal
  • Verbinding maken met de database met ADO.NET en Visual Studio
  • Tabellen maken met ADO.NET
  • Gegevens invoegen, bijwerken en verwijderen met ADO.NET
  • Querygegevens ADO.NET

Tip

Deze gratis Learn-module laat zien hoe u een ASP.NET-toepassing ontwikkelt en configureert waarmee een query wordt uitgevoerd op een Azure SQL Database, inclusief het maken van een eenvoudige database.

Vereisten

Meld u aan bij Azure Portal

Meld u aan bij de Azure-portal.

Een IP-firewallregel op serverniveau maken

SQL Database maakt een IP-firewall op serverniveau. De firewall voorkomt dat externe toepassingen en hulpprogramma's verbinding maken met de server of databases op de server, tenzij een firewallregel hun IP via de firewall toestaat. Als u externe connectiviteit voor uw database wilt inschakelen, moet u eerst een IP-firewallregel voor uw IP-adres (of IP-adresbereik) toevoegen. Volg deze stappen als u een IP-firewallregel op serverniveau wilt maken.

Belangrijk

SQL Database communiceert via poort 1433. Als u verbinding probeert te maken met deze service vanuit een bedrijfsnetwerk, is uitgaand verkeer via poort 1433 mogelijk niet toegestaan door de firewall van uw netwerk. In dat geval kunt u geen verbinding maken met uw database, tenzij de beheerder poort 1433 openstelt.

  1. Nadat de implementatie is voltooid, selecteert u SQL-databases in het linkermenu en selecteert u vervolgens uwDatabase op de pagina SQL-databases. De overzichtspagina voor de database wordt geopend, met de volledig gekwalificeerde servernaam (bijvoorbeeld yourserver.database.windows.net) en opties voor verdere configuratie.

  2. Kopieer vanuit SQL Server Management Studio deze volledig gekwalificeerde servernaam om verbinding te maken met de server en de databases.

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

  3. Selecteer Netwerken onder Instellingen. Kies het tabblad Openbare toegang en selecteer vervolgens Geselecteerde netwerken onder Openbare netwerktoegang om de sectie Firewallregels weer te geven .

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

  4. Selecteer Client-IP toevoegen op de werkbalk om uw huidige IP-adres toe te voegen aan een nieuwe IP-firewallregel. Een IP-firewallregel kan poort 1433 openen voor een afzonderlijk IP-adres of voor een aantal IP-adressen.

  5. Selecteer Opslaan. Er wordt een IP-firewallregel op serverniveau gemaakt voor uw huidige IP-adres waarbij poort 1433 wordt geopend op de server.

  6. Selecteer OK en sluit de pagina Firewallinstellingen.

Uw IP-adres wordt niet meer geblokkeerd via de IP-firewall. U kunt nu verbinding maken met uw database met SQL Server Management Studio of een ander hulpprogramma naar keuze. Gebruik het beheerdersaccount voor de server dat u eerder hebt gemaakt.

Belangrijk

Voor alle Azure-services is toegang via de IP-firewall van SQL Database standaard ingeschakeld. Selecteer UIT op deze pagina om de toegang voor alle Azure-services uit te schakelen.

Voorbeeld van C#-programma

In de volgende secties van dit artikel wordt een C#-programma gepresenteerd dat gebruikmaakt van ADO.NET voor het verzenden van Transact-SQL-instructies (T-SQL) naar SQL Database. Met het C#-programma worden de volgende acties aangetoond:

ERD (diagram Relatie tussen eenheden)

Voor de CREATE TABLE-instructies is het trefwoord VERWIJZINGEN nodig voor het maken van een FK-relatie (refererende sleutel) tussen twee tabellen. Als u tempdb gebruikt, geeft u commentaar bij het trefwoord --REFERENCES met behulp van twee streepjes aan het begin.

Op de ERD wordt de relatie tussen de twee tabellen weergegeven. De waarden in de onderliggende kolom tabEmployee.DepartmentCode zijn beperkt tot de waarden in de bovenliggende kolom tabDepartment.Department.

ERD showing foreign key

Notitie

U kunt de T-SQL bewerken om een # toe te voegen vóór de tabelnamen. Hierdoor worden ze gemaakt als tijdelijke tabellen in tempdb. Dit is nuttig voor demonstratiedoeleinden, wanneer er geen testdatabase beschikbaar is. Er worden geen verwijzingen naar refererende sleutels afgedwongen wanneer deze worden gebruikt. Tijdelijke tabellen worden automatisch verwijderd wanneer de verbinding wordt verbroken zodra het programma is uitgevoerd.

Compileren en uitvoeren

Het C#-programma is logischerwijs één .cs-bestand en fysiek onderverdeeld in verschillende codeblokken, waardoor elk blok gemakkelijker te begrijpen is. Ga als volgt te werk om dit programma te compileren en uit te voeren:

  1. Maak een C#-project in Visual Studio. Het projecttype moet Console zijn. U vindt dit onder Sjablonen>Visual C#>Windows Desktop>Console App (.NET Framework).

  2. In het bestand Program.cs vervangt u de beginregels van de code aan de hand van de volgende stappen:

    1. Kopieer en plak de volgende codeblokken in de volgorde waarin ze worden gepresenteerd (zie Verbinding maken met de database, T-SQL genereren en Indienen bij database).

    2. Wijzig de volgende waarden in de Main-methode:

      • cb.DataSource
      • cb.UserID
      • cb.Password
      • cb.InitialCatalog
  3. Controleer of wordt verwezen naar de assembly System.Data.dll. Vouw in het deelvenster Solution Explorer het knooppunt Verwijzingen uit om dit te controleren.

  4. Selecteer de knop Start om het programma te bouwen en uit te voeren in Visual Studio. De rapportuitvoer wordt in een programmavenster weergegeven, hoewel GUID-waarden tussen testuitvoeringen zullen variëren.

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

Verbinding maken met SQL Database met behulp van 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();
        }

Methoden voor het retourneren van T-SQL-instructies

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;
    ";
}

T-SQL indienen bij de 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
}

Tip

Ga naar Zelfstudie: Transact-SQL-instructies schrijven voor meer informatie over het schrijven van SQL-query's.

Volgende stap

Ga naar de volgende zelfstudie voor meer informatie over gegevensmigratie.