Tutorial: Mendesain database hubungan di Azure SQL Database C# dan ADO.NET

Berlaku untuk:Azure SQL Database

Azure SQL Database adalah database relasional sebagai layanan (DBaaS) di Microsoft Cloud (Azure). Dalam tutorial ini, Anda mempelajari cara menggunakan portal Azure dan ADO.NET dengan Visual Studio untuk:

  • Buat database tunggal menggunakan portal Microsoft Azure.
  • Menyiapkan aturan firewall IP tingkat server menggunakan portal Microsoft Azure
  • Menyambungkan ke database dengan ADO.NET dan Visual Studio
  • Membuat tabel dengan ADO.NET
  • Menyisipkan, memperbarui, dan menghapus data dengan ADO.NET
  • Kueri data ADO.NET

Tip

Modul Learn gratis ini menunjukkan kepada Anda cara Mengembangkan dan mengonfigurasi aplikasi ASP.NET yang meminta Azure SQL Database, termasuk pembuatan database sederhana.

Prasyarat

Masuk ke portal Azure

Masuk ke portal Azure.

Membuat aturan firewall tingkat server

SQL Database membuat firewall IP di tingkat server. Firewall ini mencegah aplikasi dan alat eksternal terhubung ke server dan database apa pun di server kecuali aturan firewall memungkinkan IP mereka melalui firewall. Untuk mengaktifkan konektivitas eksternal ke database Anda, Anda harus terlebih dahulu menambahkan aturan firewall IP untuk alamat IP Anda (atau rentang alamat IP). Ikuti langkah-langkah ini untuk membuat aturan firewall IP tingkat server.

Penting

SQL Database berkomunikasi melalui port 1433. Jika Anda mencoba menyambungkan ke layanan ini dari dalam jaringan perusahaan, lalu lintas keluar melalui port 1433 mungkin tidak diizinkan oleh firewall jaringan Anda. Jika demikian, Anda tidak bisa tersambung ke database Anda kecuali administrator Anda membuka port 1433.

  1. Setelah penyebaran selesai, pilih database SQL dari menu sebelah kiri lalu pilih yourDatabase di halaman database SQL. Halaman gambaran umum untuk database Anda terbuka, memperlihatkan nama Serveryang sepenuhnya memenuhi syarat (seperti yourserver.database.windows.net) dan menyediakan opsi untuk konfigurasi lebih lanjut.

  2. Salin nama server yang sepenuhnya memenuhi syarat ini yang digunakan untuk menyambungkan ke server dan database Anda dari SQL Server Management Studio.

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

  3. Pilih Jaringan di bawah Pengaturan. Pilih tab Akses Publik, lalu pilih Jaringan yang dipilih di bawah Akses jaringan publik untuk menampilkan bagian Aturan firewall.

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

  4. Pilih Tambahkan IP klien pada toolbar untuk menambahkan alamat IP Anda saat ini ke aturan firewall IP baru. Aturan firewall IP dapat membuka port 1433 untuk satu alamat IP atau rentang alamat IP.

  5. Pilih Simpan. Aturan firewall IP tingkat server dibuat untuk port pembukaan alamat IP Anda saat ini 1433 di server.

  6. Pilih OK lalu tutup halaman Pengaturan firewall.

Alamat IP Anda sekarang dapat melewati firewall IP. Sekarang Anda dapat tersambung ke database Anda menggunakan SQL Server Management Studio atau alat lain pilihan Anda. Pastikan untuk menggunakan akun admin server yang Anda buat sebelumnya.

Penting

Secara default, akses melalui firewall IP Database SQL diaktifkan untuk semua layanan Azure. Pilih NONAKTIF di halaman ini untuk menonaktifkan akses untuk semua layanan Azure.

Contoh program C#

Bagian selanjutnya dari artikel ini menyajikan program C# yang menggunakan ADO.NET untuk mengirim pernyataan Transact-SQL (T-SQL) ke SQL Database. Program C# menunjukkan tindakan berikut:

Diagram Hubungan Entitas (ERD)

Pernyataan CREATE TABLE melibatkan kata kunci REFERENCES untuk membuat hubungan kunci asing (FK) di antara dua tabel. Jika Anda menggunakan tempdb, berikan komentar pada kata kunci --REFERENCES menggunakan sepasang tanda hubung antar baris.

ERD menampilkan hubungan antara dua tabel. Nilai di kolom tabEmployee.DepartmentCodechild terbatas pada nilai dari kolom tabDepartment.DepartmentCodeparent.

ERD showing foreign key

Catatan

Anda memiliki opsi untuk mengedit T-SQL untuk menambahkan # antar baris ke nama tabel, yang membuatnya sebagai tabel sementara di tempdb. Ini berguna untuk tujuan demonstrasi, ketika tidak ada database pengujian yang tersedia. Setiap referensi ke kunci asing tidak diberlakukan selama penggunaannya dan tabel sementara dihapus secara otomatis ketika koneksi ditutup setelah program selesai berjalan.

Untuk mengompilasi dan menjalankan

Program C# secara logis adalah satu file .cs, dan secara fisik dibagi menjadi beberapa blok kode, untuk membuat setiap blok lebih mudah dipahami. Untuk mengompilasi dan menjalankan program, lakukan langkah-langkah berikut:

  1. Buat proyek baru di Visual Studio Jenis proyek harus Konsol, ditemukan di Templat>Visual C#>Windows Desktop>Console App (.NET Framework).

  2. Dalam file Program.cs, ganti baris kode permulaan dengan langkah-langkah berikut:

    1. Salin dan tempel blok kode berikut ini, dalam urutan yang sama dengan yang disajikan, lihat Menyambungkan ke database, Menghasilkan T-SQL, dan Kirim ke database.

    2. Ubah nilai berikut dalam metode Main:

      • cb.DataSource
      • cb.UserID
      • cb.Password
      • cb.InitialCatalog
  3. Pastikan perakitan System.Data.dll direferensikan. Untuk memverifikasi, perluas node Referensi di panel Penjelajah Solusi.

  4. Untuk membangun dan menjalankan program dari Visual Studio, pilih tombol Mulai. Output laporan ditampilkan di jendela program, meskipun nilai GUID akan bervariasi di setiap uji coba.

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

Menyambungkan ke SQL Database menggunakan 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();
        }

Metode yang mengembalikan pernyataan 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;
    ";
}

Mengirim T-SQL ke database

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

Untuk mempelajari selengkapnya tentang menulis kueri SQL, kunjungi Tutorial: Menulis pernyataan T-SQL.

Langkah selanjutnya

Lanjutkan ke tutorial berikutnya untuk mempelajari tentang migrasi data.