🎉

C#でSQL Serverに接続し、データを取得・表示する方法

に公開

はじめに

C# ユーザーのみなさん、こんにちは。
この記事では、C# で SQL Server に接続し、データを取得し、DataGridView に表示する方法 を解説します。

SQLServerをDockerで立ち上げたい場合

DBの立ち上げ

docker-compose.yml
version: '3.8'  # Docker Composeのバージョンを指定 (最新の安定バージョンを使用)

services:  # Docker Composeで管理するサービスの定義
  sqlserver:  # サービス名 (この場合、SQL Serverを定義)
    image: mcr.microsoft.com/mssql/server:2022-latest  # 使用するSQL ServerのDockerイメージ (2022の最新バージョン)
    container_name: sqlserver  # 作成されるコンテナの名前 (任意の名前を指定可能)
    
    environment:  # 環境変数の設定
      - ACCEPT_EULA=Y  # SQL Serverのライセンス条項に同意 (必須)
      - MSSQL_SA_PASSWORD=yourStrong(!)Password  # SQL Serverの管理者(SA)ユーザーのパスワードを設定
    
    ports:  # ホストマシンとコンテナのポートマッピング
      - 1433:1433  # ホストの1433ポートをコンテナの1433ポートにマッピング (SQL Serverのデフォルトポート)

    hostname: mydbserver  # コンテナのホスト名を設定 (デフォルトはコンテナIDだが、識別しやすくするために指定)
    
    volumes:  # 永続化するデータのマウント設定
      - ./mssql/data:/var/opt/mssql/data  # SQL Serverのデータベースファイルをホストの `./mssql/data` に保存
      - ./mssql/secrets:/var/opt/mssql/secrets  # 認証情報や暗号化関連のデータを `./mssql/secrets` に保存

volumes:  # 定義されたボリューム (使われていないが、永続化ストレージとして定義可能)
  sqlserver_data:  # SQL Serverのデータ用ボリューム (未使用)
  sqlserver_secrets:  # SQL Serverの機密情報保存用ボリューム (未使用)

Modelの作成

Model(UsersModel)とは?

モデル(Model)は、データをプログラム内で扱いやすくするための設計図 です。
SQL Server の Users テーブルの 1行分のデータを格納するためのクラス を作成します。

データベースの Users テーブルには、以下のようなデータが格納されているとします。

Id Name Age
1 太郎 25
2 花子 30

この 1行のデータオブジェクトとして表現 するのが UsersModel です。

UsersModel.cs
using System;

namespace DBConnectionTest
{
    /// <summary>
    /// Users テーブルのデータを表すモデルクラス
    /// </summary>
    public class UsersModel
    {
        /// <summary>
        /// ユーザーの一意の識別子 (ID)
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// ユーザーの名前
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// ユーザーの年齢
        /// </summary>
        public int Age { get; set; }

        /// <summary>
        /// UsersModel のコンストラクタ
        /// </summary>
        /// <param name="id">ユーザーのID (データベースの主キー)</param>
        /// <param name="name">ユーザーの名前</param>
        /// <param name="age">ユーザーの年齢</param>
        public UsersModel(int id, string name, int age)
        { 
            // フィールドに引数の値をセット
            Id = id;     // IDを設定
            Name = name; // 名前を設定
            Age = age;   // 年齢を設定
        }
    }
}

Serviceの作成

Service(UsersService)とは?

サービス(Service)は、データベースとやり取りを行う役割 を持つクラスです。

データを取得する流れ

  1. SQL Server に接続する
  2. SQL クエリを実行する
  3. 取得したデータを UsersModel に変換し、リスト (List<UsersModel>) に格納
  4. リストを呼び出し元に返す
UsersService.cs
using System;
using System.Collections.Generic;
using System.Data.SqlClient;

namespace DBConnectionTest
{
    /// <summary>
    /// ユーザー情報を取得するためのサービスクラス
    /// </summary>
    public static class UsersService
    {
        /// <summary>
        /// SQL Server への接続文字列
        /// </summary>
        private static readonly string _connection;

        /// <summary>
        /// 静的コンストラクタ
        /// クラスが最初に参照されたときに一度だけ実行される
        /// </summary>
        static UsersService()
        {
            // SQL Server への接続情報を設定する
            var builder = new SqlConnectionStringBuilder();

            // SQL Server のホスト名または IP アドレス
            // 今回は Docker コンテナの SQL Server に接続するため localhost と 1433 ポートを指定
            builder.DataSource = "localhost,1433";

            // 接続するデータベースの名前
            builder.InitialCatalog = "testDB";

            // 統合セキュリティ (Windows認証) を使用しない (SQL Server 認証を使用する)
            builder.IntegratedSecurity = false;

            // SQL Server のログインユーザーID (デフォルトの管理者は "sa")
            builder.UserID = "sa";

            // パスワード (Docker 起動時に指定したものと同じにする)
            builder.Password = "yourStrong(!)Password";

            // サーバー証明書の検証をスキップ (開発環境向けの設定)
            builder.TrustServerCertificate = true;

            // 接続文字列を作成
            _connection = builder.ToString();
        }

        /// <summary>
        /// Users テーブルの全データを取得する
        /// </summary>
        /// <returns>Users テーブルのデータ一覧 (リスト形式)</returns>
        public static List<UsersModel> RetrieveUsers()
        {
            // 取得する SQL クエリ
            var sql = @"
SELECT
    Id,   -- ユーザーID
    Name, -- ユーザー名
    Age   -- 年齢
FROM
    Users
";

            // 取得結果を格納するリスト
            var results = new List<UsersModel>();

            // SQL Server への接続を確立
            using (var conn = new SqlConnection(_connection))
            // SQL コマンドを作成 (SQL クエリと接続情報を指定)
            using (var cmd = new SqlCommand(sql, conn))
            {
                // データベース接続を開く
                conn.Open();

                // SQL クエリを実行し、データを取得する
                using (var reader = cmd.ExecuteReader())
                {
                    // 取得したデータを 1 行ずつ処理
                    while (reader.Read()) 
                    {
                        // UsersModel のインスタンスを作成し、リストに追加
                        results.Add(new UsersModel(
                            Convert.ToInt32(reader["Id"]),   // ID (整数型に変換)
                            Convert.ToString(reader["Name"]), // 名前 (文字列型に変換)
                            Convert.ToInt32(reader["Age"])   // 年齢 (整数型に変換)
                        ));
                    }
                }
            }

            // 取得したデータのリストを返す
            return results;
        }
    }
}

データグリッドビューにデータを表示する。

最後にデータグリッドビューにDBから取得した値を表示します。
データグリッドビューには様々な値を表示できますが、
今回はDBから取得したい全ての値を表示させます。

データグリッドビューの設定

  1. データグリッドビューの右上にある▶をクリック
  2. 「データソースの選択」→「プロジェクトデータソースの選択」をクリック
  3. 「オブジェクト」を選んで「次へ」をクリック
  4. そこに先ほど作成したModelがあるので選択する。
    存在しない場合は一度プロジェクトをビルドする。

データグリッドビューにデータを渡す。

// ① UsersService の RetriveUsers() メソッドを呼び出し、
//    データベース (Users テーブル) からユーザー情報を取得する。
//    取得結果は List<UsersModel> 型のリストとして返される。
var usersList = UsersService.RetriveUsers();

// ② DataGridView のデータソース (DataSource) に、取得したユーザー情報を設定。
//    List<UsersModel> を DataSource にセットすると、
//    DataGridView が自動的にデータを表として表示してくれる。
dataGridView1.DataSource = usersList;

最後に

新人研修でDBの接続方法が分からず、調べても分からず、悩んだ記憶があります。
そんな初心者の方にこの記事が届くことを願います。

Discussion