Öğretici: Azure SQL Veritabanı C# ve ADO.NET ilişkisel veritabanı tasarlama

Şunlar için geçerlidir:Azure SQL Veritabanı

Azure SQL Veritabanı, Microsoft Bulutu'ndaki (Azure) bir hizmet olarak ilişkisel veritabanıdır (DBaaS). Bu öğreticide, Visual Studio ile ADO.NET ve Azure portalını kullanarak şu işlemleri gerçekleştirmeyi öğreneceksiniz:

  • Azure portalını kullanarak veritabanı oluşturma
  • Azure portalını kullanarak sunucu düzeyinde IP güvenlik duvarı kuralı ayarlama
  • ADO.NET ve Visual Studio ile veritabanına bağlanma
  • ADO.NET ile tablo oluşturma
  • ADO.NET ile veri ekleme, güncelleştirme ve silme
  • ADO.NET ile veri sorgulama

İpucu

Bu ücretsiz Learn modülü, basit bir veritabanı oluşturma dahil olmak üzere bir Azure SQL Veritabanı sorgulayan bir ASP.NET uygulaması geliştirmeyi ve yapılandırmayı gösterir.

Önkoşullar

Azure portalda oturum açma

Azure Portal’ında oturum açın.

Sunucu düzeyinde IP güvenlik duvarı kuralı oluşturma

SQL Veritabanı, sunucu düzeyinde bir IP güvenlik duvarı oluşturur. Bu güvenlik duvarı, bir güvenlik duvarı kuralı güvenlik duvarı üzerinden IP'lerine izin vermediği sürece dış uygulamaların ve araçların sunucuya ve sunucudaki veritabanlarına bağlanmasını engeller. Veritabanınıza dış bağlantıyı etkinleştirmek için önce IP adresiniz (veya IP adresi aralığı) için bir IP güvenlik duvarı kuralı eklemeniz gerekir. Sunucu düzeyinde ip güvenlik duvarı kuralı oluşturmak için bu adımları izleyin.

Önemli

SQL Veritabanı 1433 numaralı bağlantı noktası üzerinden iletişim kurar. Şirket ağı içinden bu hizmete bağlanmaya çalışıyorsanız, ağınızın güvenlik duvarı tarafından 1433 numaralı bağlantı noktası üzerinden giden trafiğe izin verilmiyor olabilir. Bu durumda, yöneticiniz 1433 numaralı bağlantı noktasını açmadığı sürece veritabanınıza bağlanamazsınız.

  1. Dağıtım tamamlandıktan sonra sol taraftaki menüden SQL veritabanları'nı seçin ve ardından SQL veritabanları sayfasında Veritabanınızıseçin. Veritabanınızın genel bakış sayfası açılır ve size tam Sunucu adını (yourserver.database.windows.net gibi) gösterir ve daha fazla yapılandırma için seçenekler sağlar.

  2. Sql Server Management Studio'dan sunucunuza ve veritabanlarınıza bağlanmak için bu tam sunucu adını kopyalayın.

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

  3. Ayarlar altında Ağ'ı seçin. Genel Erişim sekmesini seçin ve ardından Güvenlik duvarı kuralları bölümünü görüntülemek için Genel ağ erişimi'nin altında Seçili ağlar'ı seçin.

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

  4. Geçerli IP adresinizi yeni bir IP güvenlik duvarı kuralına eklemek için araç çubuğunda İstemci IP'sini ekle'yi seçin. IP güvenlik duvarı kuralı, tek bir IP adresi veya ip adresi aralığı için 1433 numaralı bağlantı noktasını açabilir.

  5. Kaydet'i seçin. Geçerli IP adresiniz için sunucuda 1433 numaralı bağlantı noktasını açan bir sunucu düzeyinde IP güvenlik duvarı kuralı oluşturulur.

  6. Tamam'ı seçin ve güvenlik duvarı ayarları sayfasını kapatın.

IP adresiniz artık IP güvenlik duvarından geçebilir. Artık SQL Server Management Studio'yu veya tercih ettiğiniz başka bir aracı kullanarak veritabanınıza bağlanabilirsiniz. Daha önce oluşturduğunuz sunucu yöneticisi hesabını kullandığınızdan emin olun.

Önemli

Varsayılan olarak, SQL Veritabanı IP güvenlik duvarı üzerinden erişim tüm Azure hizmetleri için etkinleştirilir. Tüm Azure hizmetlerine erişimi devre dışı bırakmak için bu sayfada KAPALI'yi seçin.

C# program örneği

Bu makalenin sonraki bölümlerinde transact-SQL (T-SQL) deyimlerini SQL Veritabanı göndermek için ADO.NET kullanan bir C# programı bulunur. C# programı aşağıdaki eylemleri gösterir:

Varlık İlişkisi Diyagramı (ERD)

deyimleri, CREATE TABLE iki tablo arasında yabancı anahtar (FK) ilişkisi oluşturmak için REFERENCES anahtar sözcüğünü içerir. tempdb kullanıyorsanız, bir çift baştaki tireyi --REFERENCES kullanarak anahtar sözcüğü açıklama satırı yapın.

ERD, iki tablo arasındaki ilişkiyi görüntüler. tabEmployee.DepartmentCode alt sütunundaki değerler tabDepartment.DepartmentCodeüst sütunundaki değerlerle sınırlıdır.

ERD showing foreign key

Not

Tablo adlarına bir öncü # eklemek için T-SQL'i düzenleme seçeneğiniz vardır ve bu da bunları tempdb'de geçici tablolar olarak oluşturur. Bu, kullanılabilir bir test veritabanı olmadığında tanıtım amacıyla kullanışlıdır. Yabancı anahtarlara yapılan başvurular, kullanımları sırasında uygulanmaz ve geçici tablolar, program çalışması bittikten sonra bağlantı kapatıldığında otomatik olarak silinir.

Derlemek ve çalıştırmak için

C# programı mantıksal olarak .cs bir dosyadır ve her bloğun anlaşılmasını kolaylaştırmak için fiziksel olarak birkaç kod bloğuna ayrılır. Programı derlemek ve çalıştırmak için aşağıdaki adımları uygulayın:

  1. Visual Studio'da bir C# projesi oluşturun. Proje türü, Şablonlar>Visual C#>Windows Masaüstü>Konsol Uygulaması (.NET Framework) altında bulunan bir Konsol olmalıdır.

  2. dosya Program.cs başlangıç kod satırlarını aşağıdaki adımlarla değiştirin:

    1. Aşağıdaki kod bloklarını kopyalayıp, sunuldukları sırayla yapıştırın. Bkz. veritabanına Bağlan, T-SQL Oluşturma ve Veritabanına gönderme.

    2. yönteminde Main aşağıdaki değerleri değiştirin:

      • Cb. Datasource
      • Cb. Userıd
      • Cb. Parola
      • Cb. InitialCatalog
  3. Derleme System.Data.dll başvurıldığını doğrulayın. Doğrulamak için Çözüm Gezgini bölmesindeki Başvurular düğümünü genişletin.

  4. Visual Studio'dan programı derlemek ve çalıştırmak için Başlangıç düğmesini seçin. Rapor çıkışı bir program penceresinde görüntülenir, ancak GUID değerleri test çalıştırmaları arasında farklılık gösterir.

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

ADO.NET kullanarak SQL Veritabanı Bağlan

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 deyimleri döndüren yöntemler

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;
    ";
}

Veritabanına T-SQL gönderme

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
}

İpucu

SQL sorguları yazma hakkında daha fazla bilgi edinmek için Öğretici: Transact-SQL deyimleri yazma bağlantısını ziyaret edin.

Sonraki adım

Veri geçişi hakkında bilgi edinmek için sonraki öğreticiye geçin.