🎉
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)は、データベースとやり取りを行う役割 を持つクラスです。
データを取得する流れ
- SQL Server に接続する
- SQL クエリを実行する
- 取得したデータを UsersModel に変換し、リスト (List<UsersModel>) に格納
- リストを呼び出し元に返す
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から取得したい全ての値を表示させます。
データグリッドビューの設定
- データグリッドビューの右上にある▶をクリック
- 「データソースの選択」→「プロジェクトデータソースの選択」をクリック
- 「オブジェクト」を選んで「次へ」をクリック
- そこに先ほど作成したModelがあるので選択する。
存在しない場合は一度プロジェクトをビルドする。
データグリッドビューにデータを渡す。
// ① UsersService の RetriveUsers() メソッドを呼び出し、
// データベース (Users テーブル) からユーザー情報を取得する。
// 取得結果は List<UsersModel> 型のリストとして返される。
var usersList = UsersService.RetriveUsers();
// ② DataGridView のデータソース (DataSource) に、取得したユーザー情報を設定。
// List<UsersModel> を DataSource にセットすると、
// DataGridView が自動的にデータを表として表示してくれる。
dataGridView1.DataSource = usersList;
最後に
新人研修でDBの接続方法が分からず、調べても分からず、悩んだ記憶があります。
そんな初心者の方にこの記事が届くことを願います。
Discussion