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も分かるのですが、インターフェイス込みでコマンドレベルの方法が分かりません。
フェッチでの方法が分からないので教えて下さい。
フェッチで以外の方法で同等の事が出来るもっと良いやり方があれば教えて下さい。
以上、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
> Npgsqlではフェッチは使えないのでしょうか?
できますよ。
http://msdn.microsoft.com/ja-jp/library/9kcbe65k …
別にNpgsqlに限った話ではなく、こういうライブラリはよっぽど独自
実装してない限り、大抵DbCommand、DbDataReaderを使うのと一緒です。
継承元クラスを直接利用するならば、
Dim con As NpgsqlConnection ' コネクションがある前提
Dim command As NpgsqlCommand = con.CreateCommand()
Dim r As NpgsqlDataReader = command.ExecuteReader()
Do While r.Read()
Console.WriteLine(r.GetString(0))
Loop
r.Close()
command.Dispose()
こんな感じに。
DB操作がわからないなら、System.Data.Common内のクラスを見るなり、
それぞれのメソッドを見るなり、他サイトでクラスやメソッド単位で調べるなり
すれば解決すると思います。
Npgsqlのクラスのほとんどは、このクラスを継承して実装が行われています。
http://msdn.microsoft.com/ja-jp/library/System.D …
Npgsqlのクラス名を知りたければ、CHMファイルがあります。
http://pgfoundry.org/frs/?group_id=1000140
No.2
- 回答日時:
ExecuteNonQuery()は、影響を受けた行数を返すと思いますが。
http://msdn.microsoft.com/ja-jp/library/system.d …
キー情報、タイムスタンプを条件に加えた状態でUPDATEを走行させた時、
タイムスタンプが同一ならば1が返されるでしょうし、異なれば
0となるでしょう。
また、存在するかどうかということは上記だけでは分からないので、
SELECTする必要があるでしょう。
ざっくりとした手順としては以下のようになると思います。
画面表示時
1.SELECTして画面を表示。タイムスタンプも保持する。
更新時
1.トランザクション開始
2.タイムスタンプを条件に含まず、行ロックでSELECTして情報を取得。
情報が取得できないならば『誰かが消した』。
3.タイムスタンプも条件に含んで、UPDATEする。
影響結果が0なら『誰かが変更した』、1なら『更新した』
4.COMMIT
No.1
- 回答日時:
> アップデート文で更新対象になった件数を取得する事はできませんか?
ExecuteNonQueryメソッドの説明をよく読んでくださいな。
http://www.postgresql.jp/document/NPGSQL/api/Npg …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
データの二重表示の原因
-
Accessにインポートしたら並び...
-
フォームからのレコード削除に...
-
3つ以上のテーブルをUNIONする...
-
ACCESSのBookmarkプロパティの...
-
MSAceess テーブル結合でメモリ...
-
Accessでレコードが更新された...
-
ACCESSファイルを開こうとする...
-
(ACCESS)並び替えをしないで...
-
Access 1レコードずつcsvで出力...
-
ManagementStudioからのデータ削除
-
SQLServerで同一条件レコードの...
-
「マスタ」と「テーブル」の違...
-
重複するキーから一番古い年月...
-
mysql IN句に1データだけ指定...
-
ACCESSのSQLで、NULLかNULLでな...
-
Accessでフィールドを比較した...
-
エクスポート時の改行コードに...
-
インデックスの再構築の意味っ...
-
ACCESS 一つのフィールドに複...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessにインポートしたら並び...
-
データの二重表示の原因
-
3つ以上のテーブルをUNIONする...
-
Access VBA Me.Requery レコー...
-
数百万件レコードのdelete
-
Access 1レコードずつcsvで出力...
-
Access カレントレコードがあり...
-
ACCESSのBookmarkプロパティの...
-
Access 削除クエリが重い
-
2つの項目が重複するレコード...
-
非連結サブフォームのレコード...
-
ManagementStudioからのデータ削除
-
Accessで重複したデータを一件...
-
フォームからのレコード削除に...
-
ACCESSにて全項目(レポート)...
-
Accessの重複クエリで最小以外...
-
SQLServerで同一条件レコードの...
-
(ACCESS)並び替えをしないで...
-
テーブルのレコード削除ができ...
-
Accessでの排他制御
おすすめ情報