البرنامج التعليمي: تصميم قاعدة بيانات علائقية في قاعدة بيانات Azure SQL باستخدام C# وADO.NET

ينطبق على: Azure SQL Database

قاعدة بيانات Azure SQL هي قاعدة بيانات علائقية كخدمة (DBaaS) في Microsoft Cloud (Azure). في هذا البرنامج التعليمي، يمكنك تعلم كيفية استخدام مدخل Microsoft Azure وADO.NET مع Visual Studio من أجل:

  • تصميم قاعدة بيانات باستخدام مدخل Microsoft Azure.
  • إعداد قاعدة جدار حماية IP على مستوى الخادم باستخدام مدخل Microsoft Azure.
  • الاتصال بقاعدة البيانات باستخدام ADO.NET وVisual Studio.
  • إنشاء جداول باستخدام ADO.NET.
  • إدراج البيانات باستخدام ADO.NET وتحديثها وحذفها.
  • الاستعلام عن البيانات باستخدام ADO.NET.

*في حال لم يكن لديك اشتراك Azure، فإنه يمكنك ⁧⁩إنشاء حساب مجاني⁧⁩ قبل البدء.

تلميح

تساعدك الوحدة النمطية التالية من Microsoft Learn على تعلم كيفية ⁧⁩تطوير وتكوين تطبيق ASP.NET يستعلم عن Azure SQL Database⁧⁩، بما في ذلك إنشاء قاعدة بيانات بسيطة.

المتطلبات الأساسية

تثبيت ⁧⁩Visual Studio 2019⁧⁩ أو إصدار أحدث.

إنشاء قاعدة بيانات فارغة في Azure SQL Database.

يتم إنشاء قاعدة بيانات في Azure SQL Database مع مجموعة محددة من موارد الحوسبة والتخزين. يتم إنشاء قاعدة البيانات ضمن ⁧⁩Azure resource group⁧⁩، وإدارتها باستخدام ⁧⁩خادم SQL منطقي⁧⁩.

اتبع هذه الخطوات لإنشاء قاعدة بيانات فارغة.

  1. انقر فوق ⁧⁩Create a resource⁧⁩ في الزاوية العلوية اليمنى من مدخل Microsoft Azure.

  2. في الصفحة ⁧⁩New⁧⁩، حدد ⁧⁩Databases⁧⁩ في القسم Azure Marketplace، ثم انقر فوق ⁧⁩SQL Database⁧⁩ في القسم ⁧⁩Featured⁧⁩.

    create empty-database

  3. املأ نموذج ⁧⁩SQL Database⁧⁩ بالمعلومات التالية، كما هو موضح في الصورة السابقة:

    الإعداد القيمة المقترحة الوصف
    اسم قاعدة البيانات ⁩yourDatabase⁧ للحصول على أسماء قواعد بيانات صالحة، راجع ⁧⁩معرفات قاعدة البيانات⁧⁩.
    الاشتراك ⁩yourSubscription⁧ للحصول على تفاصيل حول اشتراكاتك، راجع الاشتراكات.
    مجموعة الموارد ⁩yourResourceGroup⁧ للحصول على أسماء مجموعات موارد صالحة، راجع تسمية القواعد والقيود.
    تحديد المصدر قاعدة بيانات فارغة تعيين ضرورة إنشاء قاعدة بيانات فارغة.
  4. انقر فوق ⁧⁩Server⁧⁩ لاستخدام خادم موجود أو إنشاء وتكوين خادم جديد. يمكنك إما تحديد خادم موجود، أو النقر فوق ⁧⁩Create a new server⁧⁩، ثم تعبئة نموذج ⁧⁩New server⁧⁩ بالمعلومات التالية:

    الإعداد القيمة المقترحة الوصف
    اسم الخادم أي اسم فريد بصفة عامة للحصول على أسماء خوادم صالحة، راجع ⁧⁩قواعد التسمية وقيودها⁧⁩.
    تسجيل دخول مسؤول الخادم أي اسم صالح للحصول على أسماء تسجيل دخول صالحة، راجع ⁧⁩معرفات قاعدة البيانات⁧⁩.
    كلمة المرور أي كلمة مرور صالحة يجب أن تتكون كلمة المرور الخاصة بك من ثمانية أحرف على الأقل، ويجب أن تحتوي على أحرف من ثلاث فئات من الفئات التالية: الأحرف الكبيرة، والأحرف الصغيرة، والأرقام، والأحرف غير الأبجدية الرقمية.
    ⁩الموقع⁧ أي موقع صالح للحصول على معلومات حول المناطق، راجع ⁧⁩Azure Regions⁧⁩.

    create database-server

  5. انقر فوق ⁧⁩Select⁧⁩.

  6. انقر فوق ⁧⁩Pricing tier⁧⁩ لتحديد مستوى الخدمة، وعدد وحدات DTUs أو vCores ومقدار التخزين. يمكنك استكشاف الخيارات لعدد وحدات DTUs/vCores ومقدار التخزين المتوفرة لك لكل مستوى خدمة.

    بعد تحديد مستوى الخدمة، وعدد وحدات DTUs أو vCores، ومقدار التخزين، انقر فوق ⁧⁩Apply⁧⁩.

  7. أدخل ⁧⁩ترتيبًا⁧⁩ لقاعدة البيانات الفارغة (لهذا البرنامج التعليمي، استخدم القيمة الافتراضية). لمزيد من المعلومات حول عمليات التجميع، راجع ⁧⁩عمليات التجميع⁧

  8. الآن بعد إكمال نموذج ⁧⁩SQL Database⁧⁩، انقر فوق ⁧⁩Create⁧⁩ لتزويد قاعدة البيانات. قد تستغرق هذه الخطوة بضع دقائق.

  9. في شريط الأدوات، انقر فوق ⁧⁩Notifications⁧⁩ لمراقبة عملية التوزيع.

    Screenshot shows Notifications in the Azure portal with Deployment in progress.

إنشاء قاعدة جدار حماية IP على مستوى الخادم

تنشئ SQL Database جدار حماية IP على مستوى الخادم. يمنع جدار الحماية هذا التطبيقات الخارجية والأدوات من الاتصال بالخادم وأي قواعد بيانات على الخادم ما لم تسمح قاعدة جدار الحماية بملكية الـ IP الخاصة بها من خلال جدار الحماية. لتمكين الاتصال الخارجي بقاعدة البيانات الخاصة بك، يجب أولاً إضافة قاعدة جدار حماية IP لعنوان IP الخاص بك (أو نطاق عنوان IP). اتبع هذه الخطوات لإنشاء ⁧⁩قاعدة جدار حماية IP على مستوى الخادم⁧⁩.

هام

تتواصل SQL Database عبر منفذ 1433. إذا كنت تحاول الاتصال بهذه الخدمة ضمن شبكة تابعة لشركة، فقد لا يسمح جدار حماية الشبكة الخاص بك بحركة الاستخدام الصادرة عبر المنفذ 1433. في هذه الحالة، لا يمكنك الاتصال بقاعدة البيانات الخاصة بك إلا إذا فتح المسؤول المنفذ 1433.

  1. بعد اكتمال التوزيع، انقر فوق ⁧⁩SQL databases⁧⁩ من القائمة اليمنى، ثم انقر فوق ⁧⁩yourDatabase⁧⁩ في الصفحة ⁧⁩SQL databases⁧⁩. تفتح صفحة النظرة العامة لقاعدة البيانات الخاصة بك، وتظهر لك ⁧⁩اسم الخادم⁧⁩ المؤهل بالكامل (مثل ⁧⁩yourserver.database.windows.net)⁧⁩، وتوفر خيارات لمزيد من التكوين.

  2. نسخ اسم الخادم المؤهل بالكامل هذا لاستخدامه للاتصال بالخادم وقواعد البيانات من SQL Server Management Studio.

    server name

  3. انقر فوق ⁧⁩Set server firewall⁧⁩ في شريط الأدوات. تفتح الصفحة ⁧⁩Firewall settings⁧⁩ للخادم.

    server-level IP firewall rule

  4. انقر فوق ⁧⁩Add client IP⁧⁩ في شريط الأدوات لإضافة عنوان IP الحالي الخاص بك إلى قاعدة جدار حماية IP جديد. يمكن أن تفتح قاعدة جدار حماية IP المنفذ 1433 لعنوان IP واحد أو نطاق من عناوين IP.

  5. انقر فوق Save. يتم إنشاء قاعدة جدار حماية IP على مستوى الخادم لعنوان IP الحالي الخاص بك، لفتح المنفذ 1433 في الخادم.

  6. انقر فوق ⁧⁩OK⁧⁩، ثم أغلق الصفحة ⁧⁩Firewall settings⁧⁩.

يمكن أن يمر عنوان IP الخاص بك الآن من خلال جدار حماية IP. يمكنك الآن الاتصال بقاعدة البيانات باستخدام SQL Server Management Studio أو أداة أخرى من اختيارك. تأكد من استخدام حساب مسؤول الخادم الذي أنشأته سابقا.

هام

بشكل افتراضي، يتم تمكين الوصول من خلال جدار حماية IP في SQL Database لجميع خدمات Azure. انقر فوق ⁧⁩OFF⁧⁩ في هذه الصفحة لتعطيل جميع خدمات Azure.

مثال على برنامج #C

تعرض الأقسام التالية من هذه المقالة برنامج C# الذي يستخدم ADO.NET لإرسال عبارات SQL للعمليات (T-SQL) إلى قاعدة بيانات SQL. يوضح برنامج #C الإجراءات التالية:

مخطط علاقة الكيان (ERD)

CREATE TABLE تتضمن عبارات REFERENCES لإنشاء علاقة مفتاح خارجي (FK) بين جدولين. إذا كنت تستخدم tempdb، فقم بالتعليق على الكلمة الرئيسية --REFERENCES باستخدام زوج من الحدود الفاصلة الأمامية.

يعرض ERD العلاقة بين الجدولين. تقتصر القيم في العمود tabEmployee.DepartmentCodechild على قيم من العمود tabDepartment.DepartmentCodeparent.

ERD showing foreign key

ملاحظة

لديك خيار تحرير T-SQL لإضافة بادئة # إلى أسماء الجدول، مما يؤدي إلى إنشائها كجداول مؤقتة في tempdb. هذا مفيد لأغراض العرض التوضيحي، عندما لا تتوفر قاعدة بيانات اختبار. لا يتم فرض أي إشارة إلى المفاتيح الخارجية أثناء استخدامها، ويتم حذف الجداول المؤقتة تلقائيًّا عند إغلاق الاتصال بعد انتهاء تشغيل البرنامج.

لتجميع وتشغيل

برنامج #C منطقيًّا هو ملف .cs واحد، وهو مقسم فعليًّا إلى عدة كتل تعليمات برمجية، لتسهيل فهم كل كتلة. لتجميع البرنامج وتشغيله، قم بالخطوات التالية:

  1. قم بإنشاء مشروع #C فيVisual Studio. يجب أن يكون نوع المشروع وحدة تحكم، موجودة ضمن ⁦⁩Templates⁦⁩⁦>⁩⁦⁩Visual C#⁦⁩⁦>⁩⁦⁩Windows Desktop⁦⁩⁦>⁩⁦⁩Console App (.NET Framework)⁦⁩.

  2. في الملف Program.cs، استبدل سطور بدء التعليمات البرمجية بالخطوات التالية:

    1. انسخ كتل التعليمات البرمجية التالية وألصقها، بالتسلسل نفسه الذي تم تقديمه به، راجع الاتصال بقاعدة البيانات، و إنشاء T-SQL ، و إرسال إلى قاعدة البيانات.

    2. غيّر القيم التالية في طريقة Main:

      • cb.DataSource
      • رقم تعريف ID المستخدم الأساسي
      • cb.Password
      • cb.InitialCatalog
  3. تحقق من الإشارة System.Data.dll لها مرجعية. للتحقق، قم بتوسيع عقدة المراجع في جزء مستكشف الحلول.

  4. لإنشاء البرنامج وتشغيله من Visual Studio، حدد الزر ابدأ. يتم عرض إخراج التقرير في نافذة البرنامج، على الرغم من أن قيم GUID ستختلف بين عمليات التشغيل الاختبارية.

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

الاتصال بقاعدة بيانات SQL باستخدام 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

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 إلى قاعدة البيانات

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
}

الخطوات التالية

في هذا البرنامج التعليمي، تعلمت مهام قاعدة البيانات الأساسية مثل إنشاء قاعدة بيانات وجداول، والاتصال بقاعدة البيانات، وتحميل البيانات، وتشغيل الاستعلامات. تعلمت كيفية القيام بالتالي:

  • تصميم قاعدة بيانات باستخدام مدخل Microsoft Azure.
  • إعداد قاعدة جدار حماية IP على مستوى الخادم باستخدام مدخل Microsoft Azure.
  • الاتصال بقاعدة البيانات باستخدام ADO.NET وVisual Studio.
  • إنشاء جداول باستخدام ADO.NET.
  • إدراج البيانات باستخدام ADO.NET وتحديثها وحذفها.
  • الاستعلام عن البيانات باستخدام ADO.NET.

واصل التقدم إلى البرنامج التعليمي التالي للتعرف على ترحيل البيانات.