Npgsqlを使ってC#でPostgreSQLに接続する方法
C#でPostgreSQLに接続するためには、一般的にNpgsqlというライブラリを使用します。Npgsqlは、PostgreSQL用の.NETデータプロバイダーであり、データベースとの接続、クエリの実行、データの取得を簡単に行うことができます。
Npgsqlのインストール
今回はNuGet パッケージマネージャを使わず、.NET CLIを使った方法でインストールします。(NuGet パッケージマネージャからもインストールできます)
プロジェクトフォルダで次のコマンドを実行します。
dotnet add package Npgsql
usingディレクティブ
using Npgsql;
接続
NpgsqlConnection
を生成して接続します。
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) {
connection.Open();
}
SELECT
NpgsqlCommand
を利用してクエリを実行し、NpgsqlDataReader
を利用して結果を取得できます。
using (NpgsqlCommand cmd = new NpgsqlCommand("SELECT * FROM mytable", connection)) {
using (NpgsqlDataReader reader = cmd.ExecuteReader()) {
while (reader.Read()) {
// 処理
}
}
}
パラメータ指定
パラメータは次のように指定できます。
NpgsqlCommand cmd = new NpgsqlCommand("SELECT * FROM mytable where id=($1) and do_user=($2)", connection) {
Parameters = {
new() { Value = 1 },
new() { Value = "user1" }
}
}
次のようにプレースホルダーを使うこともできます。
NpgsqlCommand cmd = new NpgsqlCommand("SELECT * FROM mytable where id=@p1", connection);
cmd.Parameters.AddWithValue("p1", 1);
cmd.Parameters.AddWithValue("p1", 1);
は次のように記述しても構いません。
cmd.Parameters.AddWithValue("@p1", 1);
一度設定したパラメータは、次のようにして変更できます。これによりコマンドの使い回しができます。
cmd.Parameters["p1"].Value = 2;
または
cmd.Parameters["@p1"].Value = 2;
AddWithValue()
時と[]
時で@
のあり・なしが変わっても同じものとして扱われます。
NpgsqlDataReaderを使った取得結果へのアクセス
NpgsqlDataReader.Read()
メソッドを使用することで、結果セットのレコードを順番に取得できます。このメソッドは、次のレコードが存在する場合にtrue
を返し、レコードを1行ずつ読み進めることが可能です。また、取得したレコードの各項目には、インデックスやカラム名を用いてアクセスできます。
using (NpgsqlDataReader reader = cmd.ExecuteReader()) {
while (reader.Read()) {
// 処理
}
}
- インデックス使用してアクセス
int id = (int)reader[0];
- カラム名を指定してアクセス
string name = (string)reader["カラム名"];
SELECTの実行例
以下は、PostgreSQLに接続し、データを取得する基本的な例です。
using Npgsql;
// PostgreSQLの接続文字列
string connectionString = "Host=127.0.0.1;Port:5432;Username=myuser;Password=mypassword;Database=mydatabase";
try {
// データベース接続
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString)) {
connection.Open();
// クエリの実行
using (NpgsqlCommand cmd = new NpgsqlCommand("SELECT * FROM mytable", connection)) {
using (NpgsqlDataReader reader = cmd.ExecuteReader()) {
while (reader.Read()) {
Console.WriteLine($"Column 1: {reader[0]}, Column 2: {reader[1]}");
}
}
}
}
} catch (NpgsqlException ex) {
Console.WriteLine($"NpgsqlException: {ex.Message}");
} catch (Exception ex) {
Console.WriteLine($"Exception: {ex.Message}");
}
コマンドのネスト動作について
以下のようにNpgsqlCommand
のネストはエラーとなるため、別々で行う必要があります。
エラーとなるコード
using (NpgsqlCommand cmd = new NpgsqlCommand("コマンド1")) {
using (NpgsqlCommand cmd2 = new NpgsqlCommand("コマンド2")) {
}
}
正常に動作するコード
using (NpgsqlCommand cmd = new NpgsqlCommand("コマンド1")) {
// 処理1
}
using (NpgsqlCommand cmd = new NpgsqlCommand("コマンド2")) {
// 処理2
}