PostgreSqlのテーブルをVBから更新
PostgreSqlのテーブルをVBから更新
【テーブル】
tbl1 (
item1 integer not null, -- 数値:ユニークキー
, item2 character varying, -- 文字
, item3 timestamp without time zone -- タイムスタンプ
, CONSTRAINT tbl1pk PRIMARY KEY (item1)
)
【仕様】
1.テーブル内の特定の1レコードを取得
2.取得したレコードをVBの画面に表示
3.入力:VBの画面で item2 の表示内容を変更
4.ボタン入力
4-1.レコードが存在しない場合
メセージボックスに「誰かが消した」と表示
4-2.タイムスタンプに変化がある場合
メセージボックスに「誰かが変更した」と表示
4-3.タイムスタンプに変化がない場合
Updateする。
【前提】
普通にアップデートするだけなら、下記でできました。
Private DateTime1 As DateTime ' 画面表示の時に取得したitem3の値が入っているとする
:
:
Dim NpgsqlConnection1 As NpgsqlConnection = New NpgsqlConnection
Dim NpgsqlCommand1 As NpgsqlCommand = New NpgsqlCommand
NpgsqlCommand1 = NpgsqlConnection1.CreateCommand
NpgsqlCommand1.CommandText = "update tbl1 " _
& "set item2 = '" & Me.TextBox1.Text & "'" _
& ", item3 = current_timestamp " _
& "where item1 =" & キー値
NpgsqlConnection1.ConnectionString = 接続情報
NpgsqlConnection1.Open()
NpgsqlCommand1.ExecuteNonQuery()
NpgsqlConnection1.Close()
【考察】
変更された場合は、更新対象外にするのは、条件に入れればなんとかなります。
NpgsqlCommand1.CommandText = "update tbl1 " _
& "set item2 = '" & Me.TextBox1.Text & "'" _
& ", item3 = current_timestamp " _
& "where item1 =" & キー値 _
& "and date_trunc('second', item3) =" & "to_timestamp('" & Format(DateTime1, "yyyy-MM-dd HH:mm:ss") & "', 'YYYY-MM-DD HH24:MI:SS')"
しかし、これではこのSQLで更新されたのか、他で更新があったためにスキップしたのかが分かりません。
直前のSQLで更新があったかどうか、もしくは何件更新対象になったかを得る事はできませんか?
もしくは、
一旦呼び出してロックし、その間にタイムスタンプを取り出し、
Vb内に持っていた前回のタイムスタンプと比較し、同じであれば更新する。
同じでなければステータスを返す。
というふうにしたいです。
【質問】
アップデート文で更新対象になった件数を取得する事はできませんか?
もしくは、フェッチの方法を教えて下さい。
上記の仕様のようにタイムスタンプを判断し、そのレコードを掴んだままアップデートしたいなら、フェッチするしかないのかと思っています。
でも、そのやり方が分かりません。
・コネクト
・カーソル定義
・カーソルオープン
・ネクストレコード
・レコードを取得し、VB側のタイムスタンプと比較←どうやって?
・カーソル行に対しアップデート
・レコードの終わり
・0件なら「誰かが消した」と表示
・カーソルクローズ
・コネクト解除
やりたい事は上記でSqlもVbも分かるのですが、インターフェイス込みでコマンドレベルの方法が分かりません。
フェッチでの方法が分からないので教えて下さい。
フェッチで以外の方法で同等の事が出来るもっと良いやり方があれば教えて下さい。
以上、よろしくお願いします。
お礼
CASE文を使えばよろしいのですね。 試してみます。ありがとうございました。