今回はNpgsqlDataAdapterを使ったDELETEの解説です。
正直あまり解説する内容は多くなく、特筆する点もありませんが基本的に使う手段の1つでもありますので解説したいと思います。
Npgsqlの本家情報は
私の作成するサンプルソースファイルは
基本的なテーブルは下記構成となります。
テーブル名 | 型 | 概要 |
---|---|---|
id | serial | 自動的にセットされる通し番号 |
time | timestamp | トランザクション開始時刻または入力された日付 |
name | text | 任意の文字列 |
numeric | integer | 任意の数値 |
時間はCREATE TABLEで「time timestamp DEFAULT clock_timestamp()」としており、意図的に時間をセットできますが、何もINSERTしなければ自動的に現在の時間がセットされます。
このテーブルに下記2つのデータが存在しているのを前提として説明します。
id | time | name | numeric |
---|---|---|---|
1 | INSERTした時間 | a | 1 |
2 | INSERTした時間 | b | 2 |
DELETEのきほん
オーソドックスな手法から
まずはFillメソッドで全てのデータを取得します。
その後DataTableの先頭の行を削除します。
これでデータの編集は完了です。
- DELETEするデータ用NpgsqlCommandを作る。
- DELETEするデータのクエリ文に渡すパワメータの数だけNpgsqlParameterを作る。
- NpgsqlParameteのParameterNameとSourceColumnを適切に設定する。
- NpgsqlCommandのParameters.Addメソッドを実行し作ったNpgsqlParameteを渡す。
- NpgsqlDataAdapterのDeleteCommandプロパティへNpgsqlCommandを渡す。
- NpgsqlDataAdapteのUpdateメソッドを実行する。
手順は前回解説したUPDATEとほぼ同じでクエリ文とNpgsqlDataAdapterのDeleteCommandプロパティへNpgsqlCommandを渡すのが違うだけです。
手順1がサンプルコードの9~11行目に該当します。
11行目で実際に実行するクエリ文と渡す値のパラメータをセットします。
手順,2,3,4はサンプルコード13~15行目が該当します。
NpgsqlParameterのParameterNameにはクエリ文で指定したパラメータ(@○○○)、SourceColumnにはデータベーステーブルの(またはDataTable)のカラム名を指定します。
そして手順5は18行目となります。
実際のDELETE実行は21行目ですが、正常にDELETEできなかった時のために例外「DBConcurrencyException」をキャッチできるようにすれば完璧です。
NpgsqlCommandBuilderを使ったDELETE
INSERTやUPDATEで紹介した手法とほぼ一緒と言ってもいいでしょう。
取得したデータが入っているDataTableのデータを1行削除しNpgsqlCommandBuilderを利用してデーテベースに反映させます。
ちなみにNpgsqlCommandBuilderのGetDeleteCommand().CommandTextプロパティを見ると
DELETE FROM "db_PostgreTest"."public"."data" WHERE (("id" = @p1) AND ((@p2 = 1 AND "time" IS NULL) OR ("time" = @p3)) AND ((@p4 = 1 AND "name" IS NULL) OR ("name" = @p5)) AND ((@p6 = 1 AND "numeric" IS NULL) OR ("numeric" = @p7)))
となっており、前回のUPDATE同様、全ての条件が一致したデータを削除しますので、既に誰かが削除したとかUPDATEされた場合は条件に一致するデータはありませんので例外となります。
0 件のコメント:
コメントを投稿