情報応用演習Ⅰ(2024)

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

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

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

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

2d-6. SQL文の正しいパラメーター化

SQL文の一部をプログラム的に置き換えることをSQL文のパラメーター化というが, 前節では正しくない,危険なパラメーター化の方法を試した.Npgsqlで正しくSQL文のパラメタ化を行うには, プリペアードステートメントと呼ばれる機能を使用するのが一般的である. これはNpgsqlに特有の機能という訳ではなくたいていのデータベースドライバが備えている機能である.

まずNpgsqlCommandに渡すSQL文の文字列のうち,置き換える必要がある部分をアットマーク@で始まる文字列に変更する. たとえば前節の例であれば_のようにする.

パラメーター化したSQL文
SELECT jugyoin_no, sei, mei
  FROM tbl_jugyoin 
 WHERE jugyoin_no = @hoge

この@で始まる文字列が,そのSQL文の一部を置き換えるパラメーター名である. このパラーメーターは,SQL文のうち単一の値を示す文脈にしか使用できない. たとえば条件式の演算子をこの方法で置き換えたりすることはできない.

このhogeというパラメーターの型を指定するには_のようにする. ここでcmdNpgsqlCommandクラスのインスタンスである.

パラメーターの型を指定する
1
cmd.Parameters.Add("hoge", NpgsqlTypes.NpgsqlDbType.Integer); // パラメータ hoge の型は int 型

この方法で準備したSQL文に実際の値を結び付けるには_のようにする.

パラメーター化したSQL文に値を結び付ける
1
cmd.Parameters["hoge"].Value = 100;

ここまでの方法を実際に試してみよう. Program.cs を_のように書き換える.

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
32
33
34
35
36
37
38
39
40
41
42
using Npgsql;

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

//
// 表示する従業員の従業員番号をキーボードから入力させる.
// 
Console.Write("対象の従業員番号を入力: ");
string? targetNo = Console.ReadLine()?.Trim();
if (string.IsNullOrEmpty(targetNo)) Environment.Exit(1);

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

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

    cmd.Parameters.Add("hoge", NpgsqlTypes.NpgsqlDbType.Integer);
    cmd.Parameters["hoge"].Value = int.Parse(targetNo);

    // ④ ↑のコマンドの実行
    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

書き換えたら実行してみよう.実行すると先ほどと同じく従業員番号の入力を求められるので 適当な従業員番号(例えば100)を入力してEnterキーを押す. 実行結果は図2d-5-1のようになる.

対象の従業員番号を入力: 100
jugyoin_no = 100, sei = 孫, mei = 正義
実行結果

ではもう一度実行してリスト2d-5-2の文字列を入力してみよう. 実行結果は_のようになる.

実行結果

変換に失敗して例外が生じていることがわかる(Visual Studio がバックグラウンドのままの場合もあるので,起動したら Visual Studio の画面を見てみよう). これは_の28行目の文字列から整数への変換での失敗であるが,仮にパラメーターhogeに文字列をセットしても例外が発生するため,意図しないSQL文が 実行されるのを防ぐことができる.

ここまでの動作を確認したら四つ目のチュートリアルは完了である. 以降の作業における混乱を防ぐため,次に進む前に Visual Studio のエディタをすべて閉じておこう.Visual Studio のいずれかのエディタのタブを右クリックして 「すべてのドキュメントを閉じる」をクリックすれば,エディタをすべて閉じることができる

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

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