情報応用演習Ⅰ(2024)

【T2d】Npgsqlを用いたデータベースへのアクセス(4/6)

プロジェクトタイプC#コンソールアプリ※
プロジェクト名T2d
ソリューション名PIT2
ターゲットフレームワーク.NET 8.0(長期的なサポート)
最上位レベルのステートメントを使用しない使用する(チェックオフ)

※ 「コンソールアプリ(.NET Framework)」ではないので注意せよ!

注意
  • 本ページの作業内容は 前のページまでの続き になっていることに注意せよ.

2d-4. Npgsqlを用いたPostgreSQLの操作の基礎

では実際にNpgsqlを用いて従業員データベースの従業員テーブルから,全従業員の情報を取り出してみよう. このために,今回は_に示すSQL文を使用する.

必要なSQL文
1
2
3
SELECT jugyoin_no, sei, mei
  FROM tbl_jugyoin
 ORDER BY jugyoin_no ASC

【★】解説するまでもないかもしれないが,これは従業員テーブル(tbl_jugyoin)の全従業員の従業員番号(jugyoin_no), 姓(sei),名(mei)を,従業員番号宇の昇順で取得するSQL文である. まずは単純にpgAdminで_のSQL文を実行してみよう.pgAdmin上で「PostgreSQL 16」→「Databases」→ 「SampleDB_hr」を右クリックし,「Query Tool」を起動して_を実行してみよう.結果は _のようになるはずである.

pgAdminによるSQL文の実行と結果

このSQL文を実行したクエリツールは後で参照するので閉じないようにしておこう

次に _のSQL文をC#のプログラムから実行する方法を試してみよう このためには自分の作成したプログラムで先ほどインストールしたライブラリ Npgsqlを利用する必要がある.Npgsqlに含まれているクラスはNpgsql名前空間に含まれているので, これらを使用するコードの冒頭に_のようなusingディレクティブを追記する必要がある.

Npgsqlの使用に必要なusingディレクティブ
1
using Npgsql;

Program.csに上記のusingディレクティブを追記したら,さらに_に示す内容を記述する.

Program.csの内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using Npgsql;

// ① 接続文字列
var connectionString = "Host=localhost;Port=5432;Database=SampleDB_hr;Username=hr_user;Password=n1z3Lo9AQap3";

// ② 「接続」を表すオブジェクトの作成
using (var conn = new NpgsqlConnection(connectionString))
{
    conn.Open(); // 接続開始

    // ③ SQLコマンドの作成    
    var sqlStatement = @"
SELECT jugyoin_no, sei, mei
  FROM tbl_jugyoin
 ORDER BY jugyoin_no ASC
";
    var cmd = new NpgsqlCommand(sqlStatement, conn);

    // ④ ↑のコマンドの実行
    var reader = cmd.ExecuteReader();

    // ⑤ ↑の実行結果の読み取り
    while (reader.Read())
    {
        var jugyoin_no = reader.GetInt32(0);
        var sei = reader.GetString(1);
        var mei = reader.GetString(2);

        Console.WriteLine($"jugyoin_no = {jugyoin_no}, sei = {sei}, mei = {mei}");
    }//while
}//using

書けたら実行してみよう.実行結果は_のようになる.

jugyoin_no = 100, sei = 孫, mei = 正義
jugyoin_no = 101, sei = 荒木, mei = 飛呂彦
jugyoin_no = 106, sei = 小沢, mei = 一郎
jugyoin_no = 107, sei = 東藤, mei = 大輝
jugyoin_no = 108, sei = 宮沢, mei = 賢治
jugyoin_no = 109, sei = 御坂, mei = 美琴
jugyoin_no = 113, sei = 安倍, mei = 晋三
jugyoin_no = 123, sei = 高橋, mei = 凜
jugyoin_no = 124, sei = 滝野, mei = 智
jugyoin_no = 143, sei = 浜田, mei = 雅功
jugyoin_no = 144, sei = 毛受, mei = 綾乃
jugyoin_no = 146, sei = 鳩山, mei = 一郎
jugyoin_no = 149, sei = 渡辺, mei = 達也
jugyoin_no = 177, sei = 斉藤, mei = 豊
jugyoin_no = 178, sei = 太宰, mei = 治
jugyoin_no = 179, sei = 阿万音, mei = 鈴羽
jugyoin_no = 200, sei = 中村, mei = 一郎
jugyoin_no = 201, sei = 岡部, mei = 倫太郎
jugyoin_no = 202, sei = 白井, mei = 黒子
jugyoin_no = 203, sei = 宮迫, mei = 博之
jugyoin_no = 204, sei = 池田, mei = 功
jugyoin_no = 205, sei = 橋田, mei = 至
jugyoin_no = 206, sei = 福沢, mei = 諭吉
実行結果

_の①~⑤で何をしているのかを説明しておこう.

①は接続文字列(connection string)と呼ばれるもので,接続先や認証情報などを含んだ文字列である. これは接続先のデータベースを示すための電話番号のようなものだと考えると分かりやすいだろう. 接続文字列はNpgsqlに限らずADO.NET系のデータベースドライバーでよく使われるフォーマットで,設定名=設定値の 組をセミコロン(;)でつなげたものとなっている.各設定名/値の出現順序は規定されない.①の接続文字列は _に示す情報を含んでいる.単純なフォーマットなので必要に応じて自分でこの接続文字列を構築できるようにしておこう

この接続文字列で使用できる設定名/値の詳細についてはConnection String Parameters - Npgsql Documentationを参照するとよいだろう.

①の接続文字列に含まれている情報
設定名設定値備考
Hostlocalhost接続先のマシンを表す文字列.localhostは自分自身を表す.
Port5432接続先のポート番号.PostgreSQLはデフォルトではポート5432で接続を待ち受けている.
DatabaseSampleDB_hr接続して使用するデータベース名.
Usernamehr_user認証に使用するユーザー名.リスト2d-2-1で設定したものを指定している.
Passwordn1z3Lo9AQap3認証に使用するパスワード.リスト2d-2-1で設定したものを指定している.

②では「データベースへの接続」そのものを表すクラスNpgsqlConnectionの変数を作成している. このクラスのインスタンスを作成するには,①のような接続文字列をコンストラクタに渡す必要がある1. このクラスのインスタンスメソッド.Open()を呼び出すと,実際に接続が開始される.

③ではSQL文(コマンド)を表すクラスNpgsqlCommandの変数を作成している.このクラスのインスタンスを作成するには, SQL文を表す文字列と②のインスタンスをコンストラクタに渡す必要がある2. 今回は_のSQL文を変数sqlStatementにいったん入れてから,NpgsqlCommandクラスのコンストラクタに渡している. ちなみに@で始まる文字列(「@"なんとかかんとか"」のような文字列)は,逐語的文字列リテラルといい,文字列の中に改行なども含めることができる文字列リテラルである.

④では,NpgsqlCommandクラスのインスタンスメソッドであるExecuteReader()メソッドを呼び出している.これは③で指定したSQL文がSELECT文のような,実行結果として表を返すSQL文である場合に 使用するメソッドである.INSERT文,DELETE文やUPDATE文の場合にはExecuteNonQuery()メソッドを使用する.

ExecuteReader()メソッドは戻り値として,NpgsqlDataReaderクラスの インスタンスを返す.④ではこの戻り値をreaderという変数に保存している.このクラスはSQL文の実行結果の表を読み取るための クラスである.

⑤のwhile文がその実行結果の表の読み取り処理である.このwhile文は実行結果の表の行ごとに繰り返される.つまり 実行結果の行数と同じだけ繰り返される.繰り返し処理の中では.GetInt32().GetString()といったメソッドを呼び出して その行に含まれる列の値を取得している.これらのメソッドには引数として整数を渡す必要があるが, この整数はSELECT文における列番号である(_).

Get~()メソッドの引数

今回は③のSELECT文で,従業員番号(0番目),姓(1番目),名(2番目)を取得しているので, 取得した行の0番目の列を整数型で取得するために.GetInt32()メソッドを使用し, 1番目と2番目の列を文字列で取得するために.GetString()メソッドを使用している. このように,正しく行の情報を読み取るにはSELECT文の実行結果の表の列数と,その列の型を正しく把握しておく必要がある


  1. 作成後に設定することもできる ↩︎

  2. いずれも作成後に設定することもできる ↩︎

Last updated on 2024-04-26
Published on 2024-04-26

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.