C#でpostgreSQLへ接続してみる

## 目次
1. 検証環境
2. DBのデータ作成
3. C#の開発環境を作る(環境変数とVScodeの設定)
4. C#のファイルを実行してデータを取得する
5. Webページに表示する準備をする 
6. DBにデータ追加し、Webページの表示が変わるか確認する

### やりたいこと
- C＃からDBのデータを参照する方法を試す
- C#で取得したデータをWebAppとして表示させる
- C#の構築をchatGPT-4 に聞きながら環境調整して実施
(ChatGPTの活用方法の検討)


## 検証環境
- OS：Window11
- ミドルウェア： .Net 9.0.1
- DateBase：PostgreSQL ver. 15.8
- DB GUI：pgAdmin ver. 8.114
- CodeEditer：VScode

### 各ツールを公式サイトからダウンロード
- [postgreSQL](https://www.enterprisedb.com/downloads/postgres-postgresql-downloads)をダウンロード
- [pgAdmin](https://www.pgadmin.org/download/pgadmin-4-windows/)をダウンロード
- [VScode](https://code.visualstudio.com/)のダウンロード
- [.Net](https://dotnet.microsoft.com/ja-jp/download/dotnet)のダウンロード
:::note warn
pgAdminはpostgreSQLダウンロード時にはダウンロードしないこと。
pgAdminのアップデートする際、別フォルダ扱いされるため、うまくアップデートできなくなります。
:::


## DBに検証データを作成する
pgAdminを開き、任意のスキーマにテーブルを作成し、テストデータを入れていく
### Tableの作成
```
CREATE TABLE test_table (
daytime timestamp
,test_no integer
,test_name varchar
,value integer
,comment varchar
,PRIMARY KEY(daytime, test_no)
);
```
作成したTableができたことを確認する
```
select * from public.test_table;
```
※任意のスキーマに変えている場合、publicは設定したスキーマ名にする必要があります。


### データの登録
作成したTableにデータを登録する
```
INSERT INTO test_table 
(daytime ,test_no ,test_name ,value ,comment )
VALUES
('2025-01-01 12:00:00', 10, 'C#connection010', 100, 'test010')
,('2025-01-01 13:00:00', 15, 'C#connection015', 110, 'test015')
;
```
Tableにデータができたことを確認する
```
select * from public.test_table;
```
任意のスキーマに変えている場合はpublicをスキーマ名にしてください。
データが入っていれば、OK

## C#の開発環境の設定
### Pathの設定
DBに接続するため、環境変数を設定する
windowsの検索窓から「環境変数を編集」と検索
Pathという項目を編集する
Pathの中にPostgreSQLのbin, lib, includeのフォルダを設定追加する

- `%\Program Files\PostgreSQL\[バージョン番号]\bin`
- `%\Program Files\PostgreSQL\[バージョン番号]\lib`
- `%\Program Files\PostgreSQL\[バージョン番号]\include`
※上記、設定後、PCの再起動が必要

### VScodeの設定
VScodeのterminal(powershell)から`echo $env:PATH`を実行し、設定したPath情報が入っているか確認する

確認出来たら、次のコマンドで、.Netフォルダを作成する。

```
dotnet new console -n [任意で設定するフォルダ名]
cd [任意で設定したフォルダ名]
```
任意で設定したフォルダに`Npgsql`をビルドする

```
dotnet add package Npgsql
```
作成されたプログラムを次のように変更

```

using System;
using Npgsql;
using System.Text;

class Program
{
  static void Main()
  {
    string connString = "Host=localhost;Username=[作成したユーザー名];Password=:[作成したユーザーのパスワード];Database=[自分で作ったDB名]";

    try
    {
      using (var conn = new NpgsqlConnection(connString))
      {
        conn.Open();
        Console.WriteLine("Connected to PostgreSQL!");

        using (var cmd = new NpgsqlCommand("SELECT daytime, test_no, test_name, value, comment FROM test_table", conn))
        using (var reader = cmd.ExecuteReader())
        {
          while (reader.Read())
          {
            Console.WriteLine($"test_no: {reader["test_no"]}, test_name: {reader["test_name"]}, all:{reader["daytime"]}");
            Console.WriteLine(cmd);
          }
        }
      }
    }
    catch (Exception ex)
    {
      // エラーが起きたときに原因がわかるようにする
      Console.WriteLine($"Error: {ex.Message}");
    }
  }
}

```

terminalなどに登録したデータが表示されていればOK

### 解説
Main()で定義している処理について

1. 接続先の設定
次の処理で接続先を設定している
`string connString = "Host=localhost;Username=testUser;Password=[作成したユーザーのパスワード];Database=testDb";`

2. 操作コマンド用 変数カーソルの設定
`var conn = new NpgsqlConnection(connString)`
SQL処理の管理（トランザクション開始と終了）となるための宣言をできるように関数を作成している。

3. SQLの実行
`var cmd = new NpgsqlCommand("SELECT daytime, test_no, test_name, value, comment FROM test_table", conn)`
SQLの実行コマンドを設定し、処理用のカーソルで呼び出している

4. 実行結果の格納
3の結果を次の変数に格納する
`var reader = cmd.ExecuteReader()`


5. . 実行結果をterminalに表示させる
`Console.WriteLine($"test_no: {reader["test_no"]}, test_name: {reader["test_name"]}, all:{reader["daytime"]}");
`
3,4から実行した結果のどの項目を表示させるか設定し、表示させている。


## まとめ
C#でDBのデータを取得する方法まではできた。
また、C#で配列に格納し、表示させる方法まで理解できた。

格納まではいいが、このままだとレコード数が増えると使うには処理時間がかかり厳しくなりそうなため、なにかしらSQLの文精査などが必要になりそう。

配列からカラムごとにデータを取り出せるので、ほしい項目だけの活用などまでには環境構築踏まえできるようになった。