C#中級

中級 C#で学ぶデータベース設計|練習問題編

導入

データベース設計は、ソフトウェア開発において重要なスキルの一つです。特に、ビジネスロジックやデータの整合性を保つために、適切な設計が求められます。ここでは、C#を用いた具体的なデータベース設計のケーススタディを通じて、実務に役立つ知識を深めていきます。

教科書レベルの解説(データベース設計)

重要な概念の整理

データベース設計においては、エンティティ、リレーションシップ、正規化といった概念が基本です。特に、エンティティ間の関係を適切に定義することが、データの整合性やクエリの効率に大きな影響を与えます。例えば、顧客情報と注文情報のリレーションシップを考慮する際、顧客が一つの注文を持つのか、複数の注文を持つのかを明確にする必要があります。

コード例(C#)


using System;
using System.Collections.Generic;
using System.Data.SqlClient;

public class DatabaseExample
{
    private string connectionString;

    public DatabaseExample(string connectionString)
    {
        this.connectionString = connectionString;
    }

    public void AddCustomer(string name, string email)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            string query = "INSERT INTO Customers (Name, Email) VALUES (@Name, @Email)";
            using (SqlCommand command = new SqlCommand(query, connection))
            {
                command.Parameters.AddWithValue("@Name", name);
                command.Parameters.AddWithValue("@Email", email);
                command.ExecuteNonQuery();
            }
        }
    }
}

コードの行ごとの解説

  1. using System; – 基本的なクラスやメソッドを使用するための名前空間をインポートします。
  2. public class DatabaseExample – データベース操作を行うクラスを定義します。
  3. private string connectionString; – データベース接続に必要な接続文字列を保持します。
  4. public DatabaseExample(string connectionString) – コンストラクタで接続文字列を初期化します。
  5. public void AddCustomer(string name, string email) – 新しい顧客をデータベースに追加するメソッドです。
  6. using (SqlConnection connection = new SqlConnection(connectionString)) – SQL Serverへの接続を確立します。
  7. connection.Open(); – データベースへの接続を開きます。
  8. string query = “INSERT INTO Customers (Name, Email) VALUES (@Name, @Email)”; – SQLクエリを定義します。
  9. using (SqlCommand command = new SqlCommand(query, connection)) – SQLコマンドを準備します。
  10. command.Parameters.AddWithValue(“@Name”, name); – SQLインジェクション対策として、パラメータを追加します。
  11. command.ExecuteNonQuery(); – SQLコマンドを実行し、データを挿入します。

練習問題編

以下の練習問題に取り組んでみてください。

  1. 問題1: 顧客テーブルに電話番号を追加するSQL文を作成してください。

    模範解答: ALTER TABLE Customers ADD PhoneNumber VARCHAR(15);

  2. 問題2: 顧客のメールアドレスを一意にするための制約を追加するSQL文を作成してください。

    模範解答: ALTER TABLE Customers ADD CONSTRAINT UQ_Email UNIQUE (Email);

  3. 問題3: 特定の顧客の情報を更新するC#メソッドを作成してください。

    模範解答:

    
    public void UpdateCustomerEmail(int customerId, string newEmail)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            string query = "UPDATE Customers SET Email = @Email WHERE Id = @Id";
            using (SqlCommand command = new SqlCommand(query, connection))
            {
                command.Parameters.AddWithValue("@Email", newEmail);
                command.Parameters.AddWithValue("@Id", customerId);
                command.ExecuteNonQuery();
            }
        }
    }
    

  4. 問題4: 新しい顧客を追加する際に、メールアドレスが重複している場合の処理を追加してください。

    模範解答:

    
    public void AddCustomerWithCheck(string name, string email)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            string checkQuery = "SELECT COUNT(*) FROM Customers WHERE Email = @Email";
            using (SqlCommand checkCommand = new SqlCommand(checkQuery, connection))
            {
                checkCommand.Parameters.AddWithValue("@Email", email);
                int count = (int)checkCommand.ExecuteScalar();
                if (count == 0)
                {
                    AddCustomer(name, email);
                }
                else
                {
                    throw new Exception("Email already exists.");
                }
            }
        }
    }
    

  5. 問題5: 顧客情報を取得するC#メソッドを作成してください。

    模範解答:

    
    public Customer GetCustomer(int customerId)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            string query = "SELECT * FROM Customers WHERE Id = @Id";
            using (SqlCommand command = new SqlCommand(query, connection))
            {
                command.Parameters.AddWithValue("@Id", customerId);
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        return new Customer
                        {
                            Id = (int)reader["Id"],
                            Name = reader["Name"].ToString(),
                            Email = reader["Email"].ToString(),
                            PhoneNumber = reader["PhoneNumber"].ToString()
                        };
                    }
                }
            }
        }
        return null;
    }
    

まとめ

  • データベース設計は、ビジネスロジックとデータの整合性を保つために重要です。
  • C#を用いたデータベース操作の具体例を通じて、実務に役立つスキルを身につけることができます。