ASP.NET Core Docker環境のPostgreSQLに接続してデータを取得する
ASP.NET Core
(C#
)のプロジェクトで、PostgreSQL
に接続して、データを取得します。
Docker PostrgeSQLのコンテナを作成するで紹介した方法で、ASP.NET Core
とPostgreSQL
の両方とも、それぞれ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
)の形式で取得したい場合は以下のようにします。
AsEnumerable
でDataRow
のコレクションに変換すれば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));