チュートリアル:C# と ADO.NET を使用して Azure SQL Database 内の単一データベースでリレーショナル データベースを設計するTutorial: Design a relational database in a single database within Azure SQL Database C# and ADO.NET

Azure SQL Database は、Microsoft Cloud (Azure) のリレーショナルなサービスとしてのデータベース (DBaaS) です。Azure SQL Database is a relational database-as-a-service (DBaaS) in the Microsoft Cloud (Azure). このチュートリアルでは、Azure Portal、ADO.NET、および Visual Studio を使用して以下の手順を実行する方法を説明します。In this tutorial, you learn how to use the Azure portal and ADO.NET with Visual Studio to:

  • Azure portal を使用して単一データベースを作成する*Create a single database using the Azure portal*
  • Azure portal を使用してサーバーレベルの IP ファイアウォール規則を設定するSet up a server-level IP firewall rule using the Azure portal
  • ADO.NET と Visual Studio を使用してデータベースに接続するConnect to the database with ADO.NET and Visual Studio
  • ADO.NET を使用してテーブルを作成するCreate tables with ADO.NET
  • ADO.NET を使用してデータを挿入、更新、削除するInsert, update, and delete data with ADO.NET
  • ADO.NET を使用してデータのクエリを実行するQuery data ADO.NET

*Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。*If you don't have an Azure subscription, create a free account before you begin.

ヒント

次の Microsoft Learn モジュールは、単純なデータベースの作成など、Azure SQL Database に対してクエリを行う ASP.NET アプリケーションを開発および構成する方法を無料で学習するのに役立ちます。The following Microsoft Learn module helps you learn for free how to Develop and configure an ASP.NET application that queries an Azure SQL Database, including the creation of a simple database.

前提条件Prerequisites

Visual Studio 2019 以降のインストール。An installation of Visual Studio 2019 or later.

空の単一データベースを作成するCreate a blank single database

Azure SQL Database の単一データベースは、定義済みの一連のコンピューティング リソースとストレージ リソースを使用して作成されます。A single database in Azure SQL Database is created with a defined set of compute and storage resources. データベースは Azure リソース グループ内に作成され、データベース サーバーを使用して管理されます。The database is created within an Azure resource group and is managed using an database server.

空の単一データベースを作成するには、次の手順に従います。Follow these steps to create a blank single database.

  1. Azure Portal の左上隅にある [リソースの作成] をクリックします。Click Create a resource in the upper left-hand corner of the Azure portal.

  2. [新規] ページで、[Azure Marketplace] セクションで [データベース] を、 [おすすめ] セクションで [SQL Database] をクリックします。On the New page, select Databases in the Azure Marketplace section, and then click SQL Database in the Featured section.

    空のデータベースを作成

  3. 前の画像で示されているように、 [SQL Database] のフォームに次の情報を入力します。Fill out the SQL Database form with the following information, as shown on the preceding image:

    SettingSetting       推奨値Suggested value 説明Description
    データベース名Database name yourDatabaseyourDatabase 有効なデータベース名については、「データベース識別子」を参照してください。For valid database names, see Database identifiers.
    サブスクリプションSubscription yourSubscriptionyourSubscription サブスクリプションの詳細については、サブスクリプションに関するページを参照してください。For details about your subscriptions, see Subscriptions.
    リソース グループResource group yourResourceGroupyourResourceGroup 有効なリソース グループ名については、名前付け規則と制限に関するページを参照してください。For valid resource group names, see Naming rules and restrictions.
    [ソースの選択]Select source 空のデータベースBlank database 空のデータベースを作成するように指定します。Specifies that a blank database should be created.
  4. [サーバー] をクリックして既存のデータベース サーバーを使用するか、新しいデータベース サーバーを作成して構成します。Click Server to use an existing database server or create and configure a new database server. 既存のサーバーを選択するか、 [新しいサーバーの作成] をクリックして [新しいサーバー] フォームに次の情報を入力します。Either select an existing server or click Create a new server and fill out the New server form with the following information:

    SettingSetting       推奨値Suggested value 説明Description
    サーバー名Server name グローバルに一意の名前Any globally unique name 有効なサーバー名については、名前付け規則と制限に関するページを参照してください。For valid server names, see Naming rules and restrictions.
    サーバー管理者ログインServer admin login 有効な名前Any valid name 有効なログイン名については、「データベース識別子」を参照してください。For valid login names, see Database identifiers.
    パスワードPassword 有効なパスワードAny valid password パスワードには 8 文字以上が含まれていること、また、大文字、小文字、数字、英数字以外の文字のうち、3 つのカテゴリの文字が使用されていることが必要です。Your password must have at least eight characters and must use characters from three of the following categories: upper case characters, lower case characters, numbers, and non-alphanumeric characters.
    LocationLocation 有効な場所Any valid location リージョンについては、「Azure リージョン」を参照してください。For information about regions, see Azure Regions.

    データベース サーバーの作成

  5. [選択] をクリックします。Click Select.

  6. [価格レベル] をクリックして、サービス レベル、DTU または仮想コア数、およびストレージの容量を指定します。Click Pricing tier to specify the service tier, the number of DTUs or vCores, and the amount of storage. DTU または仮想コア数とストレージに関して、サービス レベルごとに利用できるオプションを確認してください。You may explore the options for the number of DTUs/vCores and storage that is available to you for each service tier.

    サービス レベル、DTU または仮想コアの数、およびストレージの容量を選択したら、 [適用] をクリックします。After selecting the service tier, the number of DTUs or vCores, and the amount of storage, click Apply.

  7. 空のデータベースの照合順序を入力します (このチュートリアルでは既定値を使用)。Enter a Collation for the blank database (for this tutorial, use the default value). 照合順序の詳細については、「Collations (照合順序)」を参照してください。For more information about collations, see Collations

  8. これで SQL Database フォームの入力が完了したので、 [作成] をクリックして、単一データベースをプロビジョニングします。Now that you've completed the SQL Database form, click Create to provision the single database. この手順には数分かかることがあります。This step may take a few minutes.

  9. ツール バーの [通知] をクリックして、デプロイ プロセスを監視します。On the toolbar, click Notifications to monitor the deployment process.

    通知

サーバーレベルの IP ファイアウォール規則を作成するCreate a server-level IP firewall rule

SQL Database サービスでは、サーバーレベルで IP ファイアウォールが作成されます。The SQL Database service creates an IP firewall at the server-level. このファイアウォールにより、外部のアプリケーションやツールは、ファイアウォール規則でその IP がファイアウォールの通過を許可されていない限り、サーバーおよびサーバー上のすべてのデータベースに接続できなくなります。This firewall prevents external applications and tools from connecting to the server and any databases on the server unless a firewall rule allows their IP through the firewall. 単一データベースに外部から接続できるようにするには、まず、IP アドレス (または IP アドレス範囲) に対する IP ファイアウォール規則を追加する必要があります。To enable external connectivity to your single database, you must first add an IP firewall rule for your IP address (or IP address range). 以下の手順に従って、SQL Database のサーバーレベルの IP ファイアウォール規則を作成します。Follow these steps to create a SQL Database server-level IP firewall rule.

重要

SQL Database サービスの通信は、ポート 1433 上で行われます。The SQL Database service communicates over port 1433. 企業ネットワーク内からこのサービスに接続しようとしても、ポート 1433 でのアウトバウンド トラフィックがネットワークのファイアウォールで禁止されている場合があります。If you are trying to connect to this service from within a corporate network, outbound traffic over port 1433 may not be allowed by your network's firewall. その場合、管理者がポート 1433 を開かない限り、単一データベースに接続することはできません。If so, you cannot connect to your single database unless your administrator opens port 1433.

  1. デプロイが完了したら、左側のメニューから [SQL データベース] をクリックし、SQL データベース ページで、yourDatabase をクリックします。After the deployment completes, click SQL databases from the left-hand menu and then click yourDatabase on the SQL databases page. お客様のデータベースの概要ページが開くと、完全修飾サーバー名 (yourserver.database.windows.net など) や追加の構成オプションが表示されます。The overview page for your database opens, showing you the fully qualified Server name (such as yourserver.database.windows.net) and provides options for further configuration.

  2. この完全修飾サーバー名をコピーします。これは、SQL Server Management Studio からお客様のサーバーとデータベースに接続するために使用します。Copy this fully qualified server name for use to connect to your server and databases from SQL Server Management Studio.

    サーバー名

  3. ツール バーで [Set server firewall](サーバー ファイアウォールの設定) をクリックします。Click Set server firewall on the toolbar. SQL Database サーバーの [ファイアウォール設定] ページが開きます。The Firewall settings page for the SQL Database server opens.

    サーバーレベルの IP ファイアウォール規則

  4. ツール バーの [クライアント IP の追加] をクリックし、現在の IP アドレスを新しい IP ファイアウォール規則に追加します。Click Add client IP on the toolbar to add your current IP address to a new IP firewall rule. IP ファイアウォール規則は、単一の IP アドレスまたは IP アドレスの範囲に対して、ポート 1433 を開くことができます。An IP firewall rule can open port 1433 for a single IP address or a range of IP addresses.

  5. [Save] をクリックします。Click Save. SQL Database サーバー上のポート 1433 を開いている現在の IP アドレスに対して、サーバーレベルの IP ファイアウォール規則が作成されます。A server-level IP firewall rule is created for your current IP address opening port 1433 on the SQL Database server.

  6. [OK] をクリックし、 [ファイアウォール設定] ページを閉じます。Click OK and then close the Firewall settings page.

これで IP アドレスが IP ファイアウォールを通過できるようになりました。Your IP address can now pass through the IP firewall. SQL Server Management Studio やその他の任意のツールを使用して、単一データベースに接続できます。You can now connect to your single database using SQL Server Management Studio or another tool of your choice. 必ず、お客様が先ほど作成したサーバー管理者アカウントを使用してください。Be sure to use the server admin account you created previously.

重要

既定では、すべての Azure サービスで、SQL Database IP ファイアウォール経由のアクセスが有効になります。By default, access through the SQL Database IP firewall is enabled for all Azure services. すべての Azure サービスに対して無効にするには、このページの [オフ] をクリックします。Click OFF on this page to disable for all Azure services.

C# プログラムの例C# program example

この記事の以降のセクションでは、ADO.NET を使って SQL データベースに Transact-SQL (T-SQL) ステートメントを送る C# プログラムを紹介します。The next sections of this article present a C# program that uses ADO.NET to send Transact-SQL (T-SQL) statements to the SQL database. C# プログラムは、以下の操作を行います。The C# program demonstrates the following actions:

エンティティ関係図 (ERD: Entity Relationship Diagram)Entity Relationship Diagram (ERD)

CREATE TABLE ステートメントでは、2 つのテーブルの間に "外部キー" (FK) リレーションシップを作成するために REFERENCES キーワードが使われています。The CREATE TABLE statements involve the REFERENCES keyword to create a foreign key (FK) relationship between two tables. tempdb を使用している場合は、先頭に二重ダッシュを付けて --REFERENCES キーワードをコメントアウトしてください。If you're using tempdb, comment out the --REFERENCES keyword using a pair of leading dashes.

ERD は、2 つのテーブルのリレーションシップを示しています。The ERD displays the relationship between the two tables. tabEmployee.DepartmentCode 列 ("") の値は、tabDepartment.DepartmentCode 列 ("") の値に限定されています。The values in the tabEmployee.DepartmentCode child column are limited to values from the tabDepartment.DepartmentCode parent column.

外部キーを示す ERD

注意

T-SQL を編集してテーブル名の前に # を追加すると、それらのテーブルが tempdb の一時テーブルになります。You have the option of editing the T-SQL to add a leading # to the table names, which creates them as temporary tables in tempdb. この方法は、デモンストレーション用途で、利用できるテスト データベースがないときに便利です。This is useful for demonstration purposes, when no test database is available. 外部キーへの参照は使用中には強制されず、一時テーブルはプログラムの実行終了後に接続が閉じると自動的に削除されます。Any reference to foreign keys are not enforced during their use and temporary tables are deleted automatically when the connection closes after the program finishes running.

コンパイルして実行するにはTo compile and run

C# プログラムは論理的には 1 つの .cs ファイルですが、物理的にはいくつかのコード ブロックに分割されています。そうすることによって、各ブロックが理解しやすくなっています。The C# program is logically one .cs file, and is physically divided into several code blocks, to make each block easier to understand. プログラムをコンパイルして実行するには、次の手順に従います。To compile and run the program, do the following steps:

  1. Visual Studio で C# プロジェクトを作成します。Create a C# project in Visual Studio. プロジェクトの種類は、"コンソール" にします。これは、 [テンプレート] > [Visual C#] > [Windows デスクトップ] > [コンソール アプリ (.NET Framework)] にあります。The project type should be a Console, found under Templates > Visual C# > Windows Desktop > Console App (.NET Framework).

  2. Program.cs ファイルで、ひな形となるコード行を以下の手順で置き換えます。In the file Program.cs, replace the starter lines of code with the following steps:

    1. 以下のコード ブロックを、示されている順序でコピーして貼り付けます。データベースへの接続T-SQL の生成、およびデータベースへの送信に関するセクションを参照してください。Copy and paste the following code blocks, in the same sequence they're presented, see Connect to database, Generate T-SQL, and Submit to database.

    2. Main メソッドで、以下の値を変更します。Change the following values in the Main method:

      • cb.DataSourcecb.DataSource
      • cb.UserIDcb.UserID
      • cb.Passwordcb.Password
      • cb.InitialCatalogcb.InitialCatalog
  3. System.Data.dll アセンブリが参照されていることを確認します。Verify the assembly System.Data.dll is referenced. [ソリューション エクスプローラー] ウィンドウで [参照] ノードを展開して確認してください。To verify, expand the References node in the Solution Explorer pane.

  4. Visual Studio でプログラムをビルドおよび実行するには、 [開始] ボタンを選択します。To build and run the program from Visual Studio, select the Start button. レポート出力がプログラム ウィンドウに表示されますが、テストの実行ごとに GUID 値は異なります。The report output is displayed in a program window, though GUID values will vary between test runs.

    =================================
    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 を使用して SQL データベースに接続するConnect to SQL database using 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 ステートメントを返すメソッドMethods that return T-SQL statements

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 を送信するSubmit T-SQL to the 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
}

次の手順Next steps

このチュートリアルでは、データベースとテーブルの作成、データベースへの接続、データの読み込み、クエリの実行など、基本的なデータベース タスクについて学習しました。In this tutorial, you learned basic database tasks such as create a database and tables, connect to the database, load data, and run queries. 以下の方法について学習しました。You learned how to:

  • データベースを作成するCreate a database
  • ファイアウォール規則の設定Set up a firewall rule
  • Visual Studio と C# を使用して SQL Database に接続するConnect to the database with Visual Studio and C#
  • テーブルの作成Create tables
  • データの挿入、更新、削除、照会Insert, update, delete, and query data

次のチュートリアルに進み、データ移行について確認してください。Advance to the next tutorial to learn about data migration.