zukucode
主にWEB関連の情報を技術メモとして発信しています。

ASP.NET Core Docker環境のPostgreSQLに接続してデータを取得する

ASP.NET Core(C#)のプロジェクトで、PostgreSQLに接続して、データを取得します。

Docker PostrgeSQLのコンテナを作成するで紹介した方法で、ASP.NET CorePostgreSQLの両方とも、それぞれDockerのコンテナ内で実行している状態とします。

パッケージのインストール

PostgreSQLに接続するためにNpgsqlというパッケージをインストールします。

PostgreSQLのデータベースに接続する処理を行うプロジェクトで、以下のコマンドを実行します。

dotnet add package Npgsql

接続文字列の設定

接続文字列は以下のように設定します。

Server=サーバー名;Database=DB名;Uid=ユーザーID;Pwd=パスワード;

例えば、postgreSQLのコンテナは以下のように設定されているとします。

docker-compose.yml
  db:
    build: ./docker/db
    environment:
      POSTGRES_USER: docker_user
      POSTGRES_PASSWORD: docker_pass
      POSTGRES_DB: docker_db
      PGDATA: /var/lib/postgresql/data/pgdata
      TZ: Asia/Tokyo
    volumes:
      - dbdata:/var/lib/postgresql/data

その場合、接続文字列は以下のようになります。

Server=db;Database=docker_db;Uid=docker_user;Pwd=docker_pass;

接続

以下のように接続します。

接続文字列は実際は外部の設定ファイルで持つと思いますが、ここでは固定でセットしています。

設定ファイルから取得する方法はASP.NET Core DBの接続文字列を設定ファイルから取得するで紹介しています。

using Npgsql;

// 接続文字列を設定して、コネクションオブジェクトを作成
using var conn = new NpgsqlConnection("Server=db;Database=docker_db;Uid=docker_user;Pwd=docker_pass;");

// コネクションオープン
conn.Open();

// SQL文を作成
var sql = @"SELECT current_date";

// SQL文とコネクションオブジェクトをパラメータにコマンドオブジェクトを作成
using var cmd = new NpgsqlCommand(sql, conn);

// コマンドを実行
var result = cmd.ExecuteScalar();

コマンドの実行方法は以下の方法などがあります。

cmd.ExecuteReader();
データリーダーで1行ずつ取得
cmd.ExecuteNonQuery();
更新結果を取得(Insert文やUpdate文で使用)

データテーブル(DataTable)の形式で取得したい場合は以下のようにします。

AsEnumerableDataRowのコレクションに変換すればLinqを使えるようになります。

// データアダプタオブジェクトを作成
using var da = new NpgsqlDataAdapter(cmd);

// データテーブルを定義
var dt = new DataTable();

// SQLを実行し、結果をデータテーブルに格納
da.Fill(dt);

// DataRowのコレクションに変換
var rows = dt.AsEnumerable();

非同期処理

非同期に対応したコマンドも用意されています。

await conn.OpenAsync();

await cmd.ExecuteScalarAsync();
await cmd.ExecuteReaderAsync();
await cmd.ExecuteNonQueryAsync();

// FillAsyncはない
await Task.Run(() => da.Fill(dt));

関連記事