Öğretici: Azure SQL Veritabanı C# ve ADO.NET

ŞUNUN İÇİN GEÇERLİDİR: Azure SQL Database

Azure SQL Veritabanı, Microsoft Bulut'ta (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:

  • veritabanını kullanarak veritabanı Azure portal
  • Güvenlik duvarını kullanarak sunucu düzeyinde IP güvenlik duvarı Azure portal
  • 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

*Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

İpucu

Aşağıdaki Microsoft Learn modülü, basit bir veritabanı oluşturma dahil olmak üzere bir ASP.NET uygulamasını sorguleyen bir Azure SQL Veritabanıgeliştirmeyi ve yapılandırmayı ücretsiz olarak öğrenmenıza yardımcı olur.

Önkoşullar

Visual Studio 2019 veya sonraki bir yüklemesi.

Azure SQL Veritabanı'de boş veritabanı oluşturma

Azure SQL Veritabanı bir dizi işlem ve depolama kaynağı ile oluşturulur. Veritabanı bir Azure kaynak grubu içinde oluşturulur ve mantıksal bir sunucu kullanılarak SQL yönetilir.

Boş bir veritabanı oluşturmak için bu adımları izleyin.

  1. Azure portalının sol üst köşesinde bulunan Kaynak oluştur öğesine tıklayın.

  2. Yeni sayfasında, Azure Market bölümünde Veritabanları’nı seçin ve ardından Öne Çıkan bölümünde SQL Veritabanı’na tıklayın.

    create empty-database

  3. Aşağıdaki SQL Veritabanı yukarıdaki görüntüde gösterildiği gibi aşağıdaki bilgilerle doldurun:

    Ayar       Önerilen değer Açıklama 
    Veritabanı adı yourDatabase Geçerli veritabanı adları için bkz. Veritabanı tanımlayıcıları.
    Abonelik yourSubscription Abonelikleriniz hakkında daha ayrıntılı bilgi için bkz. Abonelikler.
    Kaynak grubu yourResourceGroup Geçerli kaynak grubu adları için bkz. Adlandırma kuralları ve kısıtlamalar.
    Kaynak seçme Boş veritabanı Boş bir veritabanı oluşturulması gerektiğini belirtir.
  4. Var olan bir sunucuyu kullanmak veya yeni bir sunucu oluşturmak ve yapılandırmak için Sunucu'ya tıklayın. Mevcut bir sunucuyu seçin veya Yeni sunucu oluştur'a tıklayın ve Yeni sunucu formunu aşağıdaki bilgilerle doldurun:

    Ayar       Önerilen değer Açıklama 
    Sunucu adı Genel olarak benzersiz bir ad Geçerli sunucu adları için bkz. Adlandırma kuralları ve kısıtlamalar.
    Sunucu yöneticisi oturum açma bilgileri Geçerli bir ad Geçerli oturum açma adları için bkz. Veritabanı tanımlayıcıları.
    Parola Geçerli bir parola Parolanız en az sekiz karakterden olmalı ve şu kategorilerin üçünden karakterler kullanmalıdır: büyük harf karakterler, küçük harf karakterler, sayılar ve alfasayısal olmayan karakterler.
    Konum Geçerli bir konum Bölgeler hakkında bilgi için bkz. Azure Bölgeleri.

    create database-server

  5. Seç’e tıklayın.

  6. Hizmet katmanını, DTU veya sanal çekirdek sayısını ve depolama alanı miktarını belirtmek için Fiyatlandırma katmanı’na tıklayın. Her hizmet katmanı için kullanılabilen DTUR/sanal çekirdek sayısı ve depolama alanı seçeneklerini keşfedebilirsiniz.

    Hizmet katmanını, DTUS veya sanal çekirdek sayısını ve depolama alanını seçerek Uygula'ya tıklayın.

  7. Boş veritabanı için bir Harmanlama girin (bu öğretici için varsayılan değeri kullanın). Harmanlamalar hakkında daha fazla bilgi için bkz. Harmanlamalar

  8. Veritabanı formu tamamlandıktan sonra SQL Veritabanı için Oluştur'a tıklayın. Bu adım birkaç dakika sürebilir.

  9. Araç çubuğunda Bildirimler’e tıklayarak dağıtım işlemini izleyin.

    Dağıtım devam ediyor olan Azure portal ekran görüntüsü.

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

SQL Veritabanı 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 olmadığı sürece dış uygulama ve araçların sunucuya ve sunucu üzerinde herhangi bir veritabanına bağlanmasını önler. Veritabanınıza dış bağlantı sağlamak 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. Bu hizmete şirket ağının içinde bağlanmaya çalışıyorsanız ağ güvenlik duvarı tarafından 1433 bağlantı noktası üzerinden giden trafiğe izin verilmiyor olabilir. Öyleyse, yöneticiniz 1433 bağlantı noktasını açmadıkça veritabanınıza bağlanamazsınız.

  1. Dağıtım tamamlandıktan sonra, SQL menüsünden Veritabanlarını seç'e tıklayın ve ardından SQL veritabanları sayfasındaveri tabanınıza tıklayın. Veritabanınıza ilişkin 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 seçeneği sağlar.

  2. Sunucudan ve veritabanlarınıza bağlanmak için bu tam sunucu adını SQL Server Management Studio.

    sunucu adı

  3. Araç çubuğunda Sunucu güvenlik duvarını ayarla’ya tıklayın. Sunucunun Güvenlik duvarı ayarları sayfası açılır.

    sunucu düzeyinde IP güvenlik duvarı kuralı

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

  5. Kaydet’e tıklayın. Sunucuda 1433 bağlantı noktasını açarak geçerli IP adresiniz için sunucu düzeyinde bir IP güvenlik duvarı kuralı oluşturulur.

  6. Tamam’a tıklayın ve sonra Güvenlik duvarı ayarları sayfasını kapatın.

IP adresiniz artık IP güvenlik duvarı üzerinden geçebilirsiniz. Artık veritabanınıza bağlanmak için tercih SQL Server Management Studio başka bir araçla bağlantı kurabilirsiniz. Daha önce oluşturduğunuz sunucu yöneticisi hesabını kullanmaya emin olun.

Önemli

Varsayılan olarak, ip güvenlik SQL Veritabanı üzerinden erişim tüm Azure hizmetleri için etkinleştirilir. Tüm Azure hizmetleri için erişimi devre dışı bırakmak için bu sayfada KAPATLI'ya tıklayın.

C# program örneği

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

Varlık Ilişkisi diyagramı (ERD)

CREATE TABLEDeyimler iki tablo arasında yabancı anahtar (FK) Ilişkisi oluşturmak için Başvurular anahtar sözcüğünü içerir. Tempdb kullanıyorsanız, --REFERENCES bir dizi baştaki tire kullanarak anahtar sözcüğü not edin.

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.

Yabancı anahtarı gösteren ERD

Not

T-SQL ' i, tablo adlarına bir lider eklemek için, # bunları tempdb'de geçici tablolar olarak oluşturan bir seçenek olacak şekilde düzenleyebilirsiniz. Bu, kullanılabilir test veritabanı olmadığında tanıtım amacıyla faydalıdır. Yabancı anahtarlara yapılan herhangi bir başvuru, kullanımları sırasında zorlanmaz ve geçici tablolar, programın çalışması bittikten sonra bağlantı kapandığında otomatik olarak silinir.

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

C# programı mantıksal olarak bir. cs dosyasıdır ve her bir bloğun anlaşılması daha kolay anlamak için fiziksel olarak birçok kod bloğuna bölünmüştü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. Program. cs dosyasında, kod başlangıç satırları ' nı aşağıdaki adımlarla değiştirin:

    1. Aşağıdaki kod bloklarını kopyalayıp, sunulan aynı sırada kopyalayıp yapıştırın, bkz. veritabanına Bağlan, T-SQL oluşturve veritabanına gönder.

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

      • CB. DataSource
      • CB. UserID
      • CB. Parolayı
      • TialCatalogcb.Ini
  3. System.Data.dll bütünleştirilmiş koda başvurulduğunu doğrulayın. Doğrulamak için Çözüm Gezgini bölmesinde Başvurular düğümünü genişletin.

  4. Visual Studio 'dan programı derlemek ve çalıştırmak için Başlat düğmesini seçin. Rapor çıktısı 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ı 'na bağlanma

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

T-SQL ' i veritabanına gönder

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
}

Sonraki adımlar

Bu öğreticide veritabanı ve tablo oluşturma, veritabanına bağlanma, veri yükleme ve sorgu çalıştırma gibi temel veritabanı görevlerini öğrendiniz. Şunları öğrendiniz:

  • veritabanını kullanarak veritabanı Azure portal
  • Güvenlik duvarını kullanarak sunucu düzeyinde IP güvenlik duvarı Azure portal
  • 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

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