Oktatóanyag: Relációs adatbázis tervezése az Azure SQL Database C# és ADO.NET

A következőre vonatkozik: Azure SQL Database

Az Azure SQL Database egy szolgáltatásként nyújtott relációs adatbázis (DBaaS) a Microsoft Cloudban (Azure). Ez az oktatóanyag bemutatja, hogyan végezheti el a következőket az Azure Portal, valamint az ADO.NET és a Visual Studio használatával:

  • Adatbázis létrehozása az Azure Portal használatával
  • Kiszolgálószintű IP-tűzfalszabály beállítása az Azure Portal használatával
  • Csatlakozás az adatbázishoz az ADO.NET és a Visual Studio használatával
  • Táblázatok létrehozása az ADO.NET-tel
  • Adatok beszúrása, frissítése és törlése az ADO.NET-tel
  • Adatok lekérdezése – ADO.NET

Tipp.

Ez az ingyenes Learn-modul bemutatja, hogyan fejleszthet és konfigurálhat egy Azure SQL Database-t lekérdező ASP.NET alkalmazást, beleértve egy egyszerű adatbázis létrehozását is.

Előfeltételek

Jelentkezzen be az Azure Portalra

Jelentkezzen be az Azure Portalra.

Kiszolgálószintű IP-tűzfalszabály létrehozása

Az SQL Database kiszolgálószintű IP-tűzfalat hoz létre. Ez a tűzfal megakadályozza, hogy külső alkalmazások és eszközök csatlakozzanak a kiszolgálóhoz és a kiszolgálón lévő adatbázisokhoz, kivéve, ha egy tűzfalszabály engedélyezi az IP-címüket a tűzfalon keresztül. Az adatbázis külső kapcsolatának engedélyezéséhez először hozzá kell adnia egy IP-tűzfalszabályt az IP-címhez (vagy IP-címtartományhoz). Kövesse az alábbi lépéseket egy kiszolgálószintű IP-tűzfalszabály létrehozásához.

Fontos

Az SQL Database az 1433-as porton kommunikál. Ha vállalati hálózaton belülről próbál csatlakozni ehhez a szolgáltatáshoz, előfordulhat, hogy a hálózat tűzfala nem engedélyezi a kimenő forgalmat az 1433-as porton keresztül. Ha igen, csak akkor csatlakozhat az adatbázishoz, ha a rendszergazda meg nem nyitja az 1433-at.

  1. Az üzembe helyezés befejezése után válassza ki az SQL-adatbázisokat a bal oldali menüből, majd válassza ki aDatabase-et az SQL-adatbázisok oldalán. Megnyílik az adatbázis áttekintő oldala, amelyen a kiszolgáló teljes neve (például yourserver.database.windows.net) látható, és további konfigurációs lehetőségeket biztosít.

  2. Másolja ki ezt a teljes kiszolgálónevet a kiszolgálóhoz és az adatbázisokhoz való csatlakozáshoz az SQL Server Management Studióból.

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

  3. Válassza a Hálózatkezelés lehetőséget a Gépház alatt. Válassza a Nyilvános hozzáférés lapot, majd válassza a Kijelölt hálózatok lehetőséget a Nyilvános hálózati hozzáférés csoportban a Tűzfalszabályok szakasz megjelenítéséhez.

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

  4. Válassza az Eszköztár ügyfél IP-címének hozzáadása lehetőséget az aktuális IP-cím új IP-tűzfalszabályhoz való hozzáadásához. Az IP-tűzfalszabály megnyithatja az 1433-at egyetlen IP-címhez vagy IP-címtartományhoz.

  5. Válassza a Mentés lehetőséget. Létrejön egy kiszolgálószintű IP-tűzfalszabály az aktuális IP-cím 1433-at megnyitó portjához a kiszolgálón.

  6. Válassza az OK gombot, majd zárja be a Tűzfal beállításai lapot.

Az IP-cím most már áthaladhat az IP-tűzfalon. Most már csatlakozhat az adatbázishoz az SQL Server Management Studióval vagy egy tetszőleges másik eszközzel. Mindenképpen használja a korábban létrehozott kiszolgálói rendszergazdai fiókot.

Fontos

Alapértelmezés szerint az SQL Database IP-tűzfalon keresztüli hozzáférés minden Azure-szolgáltatáshoz engedélyezve van. Ezen a lapon a KI gombra kattintva letilthatja az összes Azure-szolgáltatáshoz való hozzáférést.

Példa C#-programra

A cikk következő szakaszai egy C#-programot mutatnak be, amely ADO.NET használ Transact-SQL-utasítások (T-SQL) SQL Database-nek való küldéséhez. A C# program a következő műveleteket mutatja be:

Entitáskapcsolati diagram (ERD)

Az CREATE TABLE utasítások tartalmazzák a REFERENCES kulcsszót, amely két tábla közötti idegen kulcs (FK) kapcsolatot hoz létre. Ha tempdb-t használ, fűzzön megjegyzést a --REFERENCES kulcsszóhoz egy pár kezdő gondolatjel használatával.

Az ERD megjeleníti a két tábla közötti kapcsolatot. A tabEmployee.DepartmentCode gyermekoszlop értékei a tabDepartment.DepartmentCodeszülőoszlop értékeire korlátozódnak.

ERD showing foreign key

Feljegyzés

A T-SQL szerkesztésével hozzáadhat egy kezdőt # a táblanevekhez, ami ideiglenes táblákként hozza létre őket a tempdb-ben. Ez bemutató célokra hasznos, ha nincs elérhető tesztadatbázis. Az idegen kulcsokra való hivatkozás nem lesz kényszerítve a használatuk során, és az ideiglenes táblák automatikusan törlődnek, amikor a kapcsolat a program futtatása után bezárul.

Fordítás és futtatás

A C# program logikailag egy .cs fájl, és fizikailag több kódblokkra van osztva, hogy az egyes blokkok könnyebben érthetők legyenek. A program fordításához és futtatásához hajtsa végre a következő lépéseket:

  1. C#-projekt létrehozása a Visual Studióban. A projekttípusnak konzolnak kell lennie, amely a Visual C#>Windows asztali>konzolalkalmazás (.NET-keretrendszer) sablonjai>között található.

  2. A fájlban Program.cs cserélje le a kód kezdősorait a következő lépésekre:

    1. Másolja és illessze be a következő kódblokkokat a bemutatott sorrendben: Csatlakozás adatbázisba, T-SQL létrehozása és Küldés az adatbázisba.

    2. Módosítsa a következő értékeket a Main metódusban:

      • Cb. Datasource
      • Cb. Userid
      • Cb. Jelszó
      • Cb. InitialCatalog
  3. Ellenőrizze, hogy a rendszer hivatkozik-e a szerelvény System.Data.dll . Az ellenőrzéshez bontsa ki a Hivatkozások csomópontot a Megoldáskezelő panelen.

  4. A Program Visual Studióból való létrehozásához és futtatásához kattintson a Start gombra. A jelentés kimenete egy programablakban jelenik meg, de a GUID értékek a tesztfuttatások között eltérőek lesznek.

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

Csatlakozás az SQL Database-be 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();
        }

T-SQL-utasításokat visszatűnő metódusok

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 küldése az adatbázisba

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
}

Tipp.

Ha többet szeretne megtudni az SQL-lekérdezések írásáról, látogasson el a Transact-SQL-utasítások írása című oktatóanyagba.

Következő lépés

Az adatmigrálásról a következő oktatóanyagban olvashat.