Självstudie: Utforma en relationsdatabas i Azure SQL Database C# och ADO.NET

Gäller för:Azure SQL Database

Azure SQL Database är en relationsdatabas-som-tjänst (DBaaS) som bygger på Microsoft Cloud (Azure). I de här självstudierna får du lära dig att använda Azure-portalen och ADO.NET med Visual Studio för att:

  • Skapa en databas med hjälp av Azure-portalen
  • Konfigurera en IP-brandväggsregel på servernivå med hjälp av Azure-portalen
  • Ansluta till databasen med ADO.NET och Visual Studio
  • Skapa tabeller med ADO.NET
  • Infoga, uppdatera och ta bort data med ADO.NET
  • Fråga efter data med ADO.NET

Dricks

Den här kostnadsfria Learn-modulen visar hur du utvecklar och konfigurerar ett ASP.NET program som kör frågor mot en Azure SQL Database, inklusive skapandet av en enkel databas.

Förutsättningar

Logga in på Azure-portalen

Logga in på Azure-portalen.

Skapa en IP-brandväggsregel på servernivå

SQL Database skapar en IP-brandvägg på servernivå. Den här brandväggen förhindrar att externa program och verktyg ansluter till servern eller databaser på servern såvida inte en brandväggsregel tillåter deras IP-adresser genom brandväggen. Om du vill aktivera extern anslutning till databasen måste du först lägga till en IP-brandväggsregel för din IP-adress (eller IP-adressintervall). Följ de här stegen för att skapa en IP-brandväggsregel på servernivå.

Viktigt!

SQL Database kommunicerar via port 1433. Om du försöker ansluta till den här tjänsten inifrån ett företagsnätverk kanske utgående trafik via port 1433 inte tillåts av nätverkets brandvägg. I så fall kan du inte ansluta till databasen om inte administratören öppnar port 1433.

  1. När distributionen är klar väljer du SQL-databaser på den vänstra menyn och väljer sedan yourDatabasesidan SQL-databaser . Översiktssidan för databasen öppnas och visar det fullständigt kvalificerade servernamnet (till exempel yourserver.database.windows.net) tillsammans med alternativ för ytterligare konfiguration.

  2. Kopiera det här fullständigt kvalificerade servernamnet. Du behöver det när du ansluter till servern och dess databaser från SQL Server Management Studio.

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

  3. Välj Nätverk under Inställningar. Välj fliken Offentlig åtkomst och välj sedan Valda nätverk under Åtkomst till offentligt nätverk för att visa avsnittet Brandväggsregler .

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

  4. Välj Lägg till klient-IP i verktygsfältet för att lägga till din aktuella IP-adress i en ny IP-brandväggsregel. Med en IP-brandväggsregel kan du öppna port 1433 för en enskild IP-adress eller för IP-adressintervall.

  5. Välj Spara. En IP-brandväggsregel på servernivå skapas för den aktuella IP-adressen som öppnar port 1433 på servern.

  6. Välj OK och stäng sedan sidan Brandväggsinställningar.

Din IP-adress kan nu passera genom IP-brandväggen. Nu kan du ansluta till databasen med hjälp av SQL Server Management Studio eller något annat valfritt verktyg. Se till att använda serveradmin-kontot som du skapade tidigare.

Viktigt!

Som standard är åtkomst via IP-brandväggen för SQL Database aktiverad för alla Azure-tjänster. Välj AV på den här sidan för att inaktivera åtkomst för alla Azure-tjänster.

C#-programexempel

I nästa avsnitt i den här artikeln presenteras ett C#-program som använder ADO.NET för att skicka Transact-SQL-instruktioner (T-SQL) till SQL Database. C#-programmet visar följande åtgärder:

Entitetsambandsdiagram (ERD)

CREATE TABLEInstruktionerna innehåller nyckelordet REFERENSER för att skapa en sekundärnyckelrelation (FK) mellan två tabeller. Om du använder tempdb kommenterar du ut --REFERENCES-nyckelordet med hjälp av ett par inledande tankstreck.

ERD visar relationen mellan de två tabellerna. Värdena i den underordnade kolumnen tabEmployee.DepartmentCode är begränsade till värden från den överordnade kolumnen tabDepartment.DepartmentCode.

ERD showing foreign key

Kommentar

Du har möjlighet att redigera T-SQL för att lägga till en ledande # till tabellnamnen, vilket skapar dem som temporära tabeller i tempdb. Det är användbart i visningssyfte när ingen testdatabas är tillgänglig. Alla referenser till sekundärnycklar tillämpas inte under deras användning och temporära tabeller tas automatiskt bort när anslutningen stängs efter att programmet har kört färdigt.

Kompilera och köra

C#-programmet är logiskt en .cs-fil och fysiskt uppdelad i flera kodblock som gör det enklare att förstå varje block. Gör följande för att kompilera och köra programmet:

  1. Skapa C#-projektet i Visual Studio. Projekttyp ska vara Konsol, som finns under Mallar>Visual C# >Windows Desktop>Konsolprogram (.NET Framework).

  2. I filen Program.cs ersätter du kodens startlinjer med följande steg:

    1. Kopiera och klistra in följande kodblock, i samma ordning som de visas. Se Anslut till databas, Generera T-SQL och Skicka till databasen.

    2. Ändra följande värden i metoden Main:

      • cb.DataSource
      • cb.UserID
      • cb.Password
      • cb.InitialCatalog
  3. Kontrollera att sammansättningen System.Data.dll är refererad. Du kan kontrollera det genom att expandera noden Referenser i fönstret Solution Explorer.

  4. Om du vill bygga och köra programmet från Visual Studio väljer du knappen Start. Rapportutdata visas i programfönstret, men GUID-värden varierar mellan testkörningarna.

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

Anslut till SQL Database med hjälp av 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();
        }

Metoder som returnerar instruktioner för 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;
    ";
}

Skicka T-SQL till databasen

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
}

Dricks

Mer information om hur du skriver SQL-frågor finns i Självstudie: Skriva Transact-SQL-instruktioner.

Gå vidare

Gå vidare till nästa självstudie om du vill lära dig mer om migrering av data.