Delen via


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 database-as-a-service (DBaaS) in de Microsoft Cloud (Azure). In deze zelfstudie leert u hoe u Azure Portal en ADO.NET gebruikt met Visual Studio om het volgende te doen:

  • Een database maken met behulp van Azure Portal
  • Een IP-firewallregel op serverniveau instellen met behulp van 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
  • Gegevens opvragen ADO.NET

Fooi

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

Voorwaarden

Aanmelden bij Azure Portal

Meld u aan bij de Azure Portal.

Een IP-firewallregel op serverniveau maken

SQL Database maakt een IP-firewall op serverniveau. Deze firewall voorkomt dat externe toepassingen en hulpprogramma's verbinding maken met de server en databases op de server, tenzij een firewallregel het IP-adres via de firewall toestaat. Als u externe connectiviteit met uw database wilt inschakelen, moet u eerst een IP-firewallregel toevoegen voor uw IP-adres (of IP-adresbereik). Volg deze stappen om een IP-firewallregel op serverniveau te 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. Zo ja, dan kunt u geen verbinding maken met uw database, tenzij de beheerder poort 1433 opent.

  1. Nadat de implementatie is voltooid, selecteert u SQL-databases in het menu aan de linkerkant en selecteert u vervolgens yourDatabase op de pagina SQL-databases. De overzichtspagina voor uw database wordt geopend, met de volledig gekwalificeerde Servernaam (zoals yourserver.database.windows.net) en opties voor verdere configuratie.

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

    Schermopname van de azure-portal, de overzichtspagina van de database, met de servernaam gemarkeerd.

  3. Navigeer in Azure Portal naar de logische SQL-server voor uw Azure SQL Database. De eenvoudigste manier is om de servernaam waarde te selecteren op de pagina SQL-databank.

  4. Selecteer in het resourcemenu onder InstellingenNetwerken.

  5. Kies het tabblad Openbare toegang en selecteer vervolgens Geselecteerde netwerken onder Openbare netwerktoegang.

    Schermopname van azure Portal, netwerkpagina, waarin wordt weergegeven dat openbare netwerktoegang is ingeschakeld.

  6. Schuif omlaag naar de sectie Firewallregels.

    Schermopname van azure Portal, pagina Netwerken, sectie Firewallregels.

  7. Selecteer Uw IPv4-clientadres toevoegen om uw huidige IP-adres toe te voegen aan een nieuwe IP-firewallregel. Een IP-firewallregel kan poort 1433 openen voor één IP-adres of een bereik van IP-adressen.

  8. Selecteer opslaan. Er wordt een IP-firewallregel op serverniveau gemaakt voor uw huidige IP-adres dat poort 1433 op de server opent.

  9. Selecteer OK- en sluit vervolgens de pagina firewallinstellingen.

    Uw IP-adres kan nu via de IP-firewall worden doorgegeven. U kunt nu verbinding maken met uw database met behulp van SQL Server Management Studio of een ander hulpprogramma van uw keuze. Zorg ervoor dat u het serverbeheerdersaccount gebruikt dat u eerder hebt gemaakt.

Belangrijk

Toegang via de IP-firewall van SQL Database is standaard ingeschakeld voor alle Azure-services. 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 weergegeven dat gebruikmaakt van ADO.NET om Transact-SQL -instructies (T-SQL) naar SQL Database te verzenden. Het C#-programma demonstreert de volgende acties:

Entiteitsrelatiediagram (ERD)

De CREATE TABLE-instructies hebben betrekking op het trefwoord VERWIJZINGEN om een relatie met refererende sleutel (FK) tussen twee tabellen te maken. Als u tempdb-gebruikt, markeert u het trefwoord --REFERENCES met behulp van een paar voorloopstreepjes.

De ERD geeft de relatie tussen de twee tabellen weer. De waarden in de kolom tabEmployee.DepartmentCodeonderliggende zijn beperkt tot waarden uit de kolom tabDepartment.DepartmentCodebovenliggende.

ERD met vreemde sleutel

Notitie

U kunt de T-SQL bewerken om een voorloop-# toe te voegen aan de tabelnamen, waardoor ze worden gemaakt als tijdelijke tabellen in tempdb-. Dit is handig voor demonstratiedoeleinden wanneer er geen testdatabase beschikbaar is. Elke verwijzing naar vreemde sleutels wordt niet afgedwongen tijdens hun gebruik en tijdelijke tabellen worden automatisch verwijderd wanneer de verbinding wordt verbroken na afloop van het programma.

Compileren en uitvoeren

Het C#-programma is logisch één .cs-bestand en is fysiek onderverdeeld in verschillende codeblokken, zodat elk blok gemakkelijker te begrijpen is. Voer de volgende stappen uit om het programma te compileren en uit te voeren:

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

  2. Vervang in het bestand Program.csde beginregels code door de volgende regels:

    1. Kopieer en plak de volgende codeblokken, in dezelfde volgorde die ze worden weergegeven, zie Verbinding maken met database, T-SQL-genereren en Verzenden naar database.

    2. Wijzig de volgende waarden in de methode Main:

      • cb.DataSource
      • cb. UserID-
      • cb.Wachtwoord
      • cb.InitialCatalog
  3. Controleer of er naar de assembly System.Data.dll wordt verwezen. Als u dit wilt controleren, vouwt u het knooppunt Verwijzingen uit in het deelvenster Oplossingsverkenner.

  4. Als u het programma wilt bouwen en uitvoeren vanuit Visual Studio, selecteert u de knop Start. De rapportuitvoer wordt weergegeven in een programmavenster, hoewel DE GUID-waarden per testuitvoering verschillen.

    =================================
    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 die T-SQL-instructies retourneren

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 verzenden naar 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 voor meer informatie over het schrijven van SQL-query's naar Zelfstudie: Transact-SQL statements schrijven.

Volgende stap

Ga naar de volgende zelfstudie voor meer informatie over gegevensmigratie.