Kurz: Návrh relační databáze ve službě Azure SQL Database V# a ADO.NET

Platí pro:Azure SQL Database

Azure SQL Database je relační databáze jako služba (DBaaS) v Microsoft Cloudu (Azure). V tomto kurzu zjistíte, jak pomocí webu Azure Portal a ADO.NET v sadě Visual Studio provádět následující úlohy:

  • Vytvoření databáze pomocí webu Azure Portal
  • Nastavení pravidla brány firewall protokolu IP na úrovni serveru pomocí webu Azure Portal
  • Připojit se k databázi pomocí ADO.NET a sady Visual Studio
  • Vytvářet tabulky pomocí ADO.NET
  • Vkládat, aktualizovat a odstraňovat data pomocí ADO.NET
  • Dotazovat data pomocí ADO.NET

Tip

V tomto bezplatném modulu Learn se dozvíte, jak vyvíjet a konfigurovat ASP.NET aplikaci, která dotazuje službu Azure SQL Database, včetně vytvoření jednoduché databáze.

Požadavky

Přihlaste se k portálu Azure Portal.

Přihlaste se k portálu Azure.

Vytvoření pravidla brány firewall protokolu IP na úrovni serveru

SQL Database vytvoří bránu firewall protokolu IP na úrovni serveru. Tato brána firewall brání externím aplikacím a nástrojům v připojení k serveru a jakékoli databáze na serveru, pokud pravidlo brány firewall neumožňuje jejich IP adresu prostřednictvím brány firewall. Pokud chcete povolit externí připojení k databázi, musíte nejprve přidat pravidlo brány firewall protokolu IP pro vaši IP adresu (nebo rozsah IP adres). Následujícím postupem vytvoříte pravidlo brány firewall protokolu IP na úrovni serveru.

Důležité

SQL Database komunikuje přes port 1433. Pokud se pokoušíte připojit k této službě z podnikové sítě, nemusí brána firewall vaší sítě povolit odchozí provoz přes port 1433. Pokud ano, nemůžete se k databázi připojit, pokud správce neotevře port 1433.

  1. Po dokončení nasazení v nabídce vlevo vyberte databáze SQL a pak na stránce databáze SQL vyberte databázi Database. Otevře se stránka přehledu pro vaši databázi s plně kvalifikovaným názvem serveru (například yourserver.database.windows.net) a poskytuje možnosti pro další konfiguraci.

  2. Zkopírujte tento plně kvalifikovaný název serveru pro připojení k serveru a databázím z aplikace SQL Server Management Studio.

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

  3. V části Nastavení vyberte Sítě. Zvolte kartu Veřejný přístup a potom v části Přístup k veřejné síti vyberte Vybrané sítě. Zobrazí se část Pravidla brány firewall.

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

  4. Vyberte Přidat IP adresu klienta na panelu nástrojů a přidejte aktuální IP adresu do nového pravidla brány firewall protokolu IP. Pravidlo brány firewall protokolu IP může otevřít port 1433 pro jednu IP adresu nebo rozsah IP adres.

  5. Zvolte Uložit. Vytvoří se pravidlo brány firewall protokolu IP na úrovni serveru pro vaši aktuální IP adresu, která otevírá port 1433 na serveru.

  6. Vyberte OK a pak zavřete stránku nastavení brány firewall.

Vaše IP adresa teď může projít bránou firewall protokolu IP. K databázi se teď můžete připojit pomocí aplikace SQL Server Management Studio nebo jiného nástroje podle vašeho výběru. Nezapomeňte použít účet správce serveru, který jste vytvořili dříve.

Důležité

Ve výchozím nastavení je přístup přes bránu firewall protokolu IP služby SQL Database povolený pro všechny služby Azure. Výběrem možnosti VYPNUTO na této stránce zakážete přístup pro všechny služby Azure.

Příklad programu jazyka C#

Další části tohoto článku představují program jazyka C#, který používá ADO.NET k odesílání příkazů jazyka Transact-SQL (T-SQL) do služby SQL Database. Program jazyka C# ukazuje následující akce:

Diagram vztahů entit (ERD)

Příkazy CREATE TABLE zahrnují klíčové slovo REFERENCES k vytvoření relace cizího klíče (FK) mezi dvěma tabulkami. Pokud používáte databázi tempdb, okomentujte --REFERENCES klíčové slovo pomocí dvojice úvodních pomlček.

ERD zobrazí relaci mezi dvěma tabulkami. Hodnoty v podřízeném sloupci tabEmployee.DepartmentCode jsou omezeny na hodnoty z nadřazenéhosloupce tabDepartment.DepartmentCode.

ERD showing foreign key

Poznámka:

Můžete upravit T-SQL a přidat tak vedoucí # názvy tabulek, které se vytvoří jako dočasné tabulky v databázi tempdb. To je užitečné pro demonstrační účely, pokud není k dispozici žádná testovací databáze. Při jejich použití se nevynucují žádné odkazy na cizí klíče a dočasné tabulky se po dokončení spuštění programu automaticky odstraní.

Kompilace a spuštění

Program jazyka C# je logicky jeden .cs soubor a je fyzicky rozdělený do několika bloků kódu, aby byl každý blok srozumitelnější. Pokud chcete program zkompilovat a spustit, proveďte následující kroky:

  1. Vytvořte projekt v jazyce C# v sadě Visual Studio. Typ projektu by měl být konzola, která se nachází v části Šablony>Visual C#>Desktop>Console App (.NET Framework).

  2. V souboru Program.cs nahraďte počáteční řádky kódu následujícím postupem:

    1. Zkopírujte a vložte následující bloky kódu ve stejném pořadí, ve kterém jsou prezentovány, viz Připojení do databáze, vygenerovat T-SQL a odeslat do databáze.

    2. V metodě změňte následující hodnoty Main :

      • Cb. Datasource
      • Cb. Userid
      • Cb. Heslo
      • Cb. InitialCatalog
  3. Ověřte, že System.Data.dll sestavení odkazuje. Chcete-li to ověřit, rozbalte uzel Odkazy v podokně Průzkumník řešení.

  4. Pokud chcete sestavit a spustit program ze sady Visual Studio, vyberte tlačítko Start . Výstup sestavy se zobrazí v okně programu, ale hodnoty GUID se budou mezi testovacími běhy lišit.

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

Připojení do SLUŽBY SQL Database pomocí 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();
        }

Metody vracející příkazy 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;
    ";
}

Odeslání T-SQL do databáze

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

Další informace o psaní dotazů SQL najdete v kurzu: Psaní příkazů jazyka Transact-SQL.

Další krok

V dalším kurzu se dozvíte o migraci dat.