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
}
このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です