PostgreSqlのテーブルをVBから更新

このQ&Aのポイント
  • PostgreSqlのテーブルをVBから更新する際、特定のレコードを取得し、表示内容を変更するボタンを実装したい。レコードが存在しない場合やタイムスタンプに変化がある場合の処理も考える。アップデート文で更新対象になった件数を取得する方法や、フェッチの方法について教えてください。
  • PostgreSqlのテーブルをVBから更新する際、特定のレコードを取得し、表示内容を変更するボタンの実装方法について教えてください。また、レコードが存在しない場合やタイムスタンプに変化がある場合の処理についても教えてください。
  • PostgreSqlのテーブルをVBから更新する際、特定のレコードを取得して表示内容を変更するボタンを実装したいです。レコードが存在しない場合やタイムスタンプに変化がある場合の処理も行いたいですが、アップデート文で更新対象になった件数を取得する方法やフェッチの方法について教えてください。
回答を見る
  • ベストアンサー

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も分かるのですが、インターフェイス込みでコマンドレベルの方法が分かりません。 フェッチでの方法が分からないので教えて下さい。 フェッチで以外の方法で同等の事が出来るもっと良いやり方があれば教えて下さい。 以上、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> Npgsqlではフェッチは使えないのでしょうか? できますよ。 http://msdn.microsoft.com/ja-jp/library/9kcbe65k(v=vs.110).aspx 別に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.Data.Common(v=vs.110).aspx Npgsqlのクラス名を知りたければ、CHMファイルがあります。 http://pgfoundry.org/frs/?group_id=1000140

その他の回答 (2)

回答No.2

ExecuteNonQuery()は、影響を受けた行数を返すと思いますが。 http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlcommand.executenonquery(v=vs.110).aspx キー情報、タイムスタンプを条件に加えた状態でUPDATEを走行させた時、 タイムスタンプが同一ならば1が返されるでしょうし、異なれば 0となるでしょう。 また、存在するかどうかということは上記だけでは分からないので、 SELECTする必要があるでしょう。 ざっくりとした手順としては以下のようになると思います。 画面表示時  1.SELECTして画面を表示。タイムスタンプも保持する。 更新時  1.トランザクション開始  2.タイムスタンプを条件に含まず、行ロックでSELECTして情報を取得。    情報が取得できないならば『誰かが消した』。  3.タイムスタンプも条件に含んで、UPDATEする。    影響結果が0なら『誰かが変更した』、1なら『更新した』  4.COMMIT

webuser
質問者

お礼

ありがとうござます。 Npgsqlではフェッチは使えないのでしょうか?

  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.1

> アップデート文で更新対象になった件数を取得する事はできませんか? ExecuteNonQueryメソッドの説明をよく読んでくださいな。 http://www.postgresql.jp/document/NPGSQL/api/Npgsql.NpgsqlCommand.ExecuteNonQuery.html

webuser
質問者

お礼

ありがとうござます。 よく読んでみました。 戻り値がそうだったのですね。

関連するQ&A

  • PHPでタイムスタンプ以外の更新日を取得する方法は

    filemtimeで更新日を取得できますが、これはタイムスタンプですよね。 2038年問題を考えると、タイムスタンプを使うものは極力避けたいと思っております。 DateTimeみたいに、タイムスタンプ以外のもので、ファイルの更新日を取得できるものはありませんか?

    • ベストアンサー
    • PHP
  • postgreSQLで更新後のデータを取得したい。

    postgreSQLで更新後のデータを取得したい。 初めて質問させていただきます。 postgreSQLでupdateした後、更新後のデータをselectで取得したいのですが、 トランザクションが完了するまでにselect文が発行されているみたいで、更新前のデータを取得してしまいます。 それぞれ、違うファイルから投げられているので、同じトランザクションにすることはできません。 何かいい方法があればご教授お願いします。 a.phpで下記のSQLを発行 update test_tbl set test1 = 'aaa' where test2 = 'bbb' a.phpが走っている間に、下記のb.phpが実行される。 select test1 from test_tbl 環境 php5 postgres8.1

  • INSERT時の時刻を自動挿入

    mysqlを使っています。 ------------------------- | ID   | TIME   | ------------------------- | char(2) | DATETIME | ---------------------------- こんな感じのテーブルなのですが、 TIMEのほうにはIDが追加されたときの時刻を入れたいのです。 TIMEの型をTIMESTAMPにすればできたんですが UPDATE時も更新されるようなので INSERT時のみ更新したいのです。 defaultで現在時刻が指定できればよかったのですが うまくいきませんでした。 可能でしょうか? 無理ならPG上から時間取得するしかないと思うんですが・・・ よろしくお願いしますm(__)m

  • レコード新規・編集時に自動で作成・編集日時を追加

    MYSQLにて(PHPMYADMIN上でテスト) ●レコード挿入(追加・新規作成)時は、 「Pt_create」と「Pt_update」の2つのフィールドに自動で現在時刻を作成 ●レコード編集時は 「Pt_update」のみ自動で現在時刻を上書き というありがちで申し訳ないですが、実行したいです。 現在調べたところ、 一番スマートでない方法は、 ******************************* Pt_createのほうに、種別:DATETIME Pt_updateのほうに、種別:DATETIME PHP側にて、$today = date("Y-m-d H:i:s");を取得して、 新規作成時・・・ $sql = INSERT INTO (`Pt_create`,`Pt_update`) VALUES ('".$today."','".$today."')・・ 編集時・・・ $sql = UPDATE SET Pt_update= '".$today."'・・ ******************************* ですよね? できたらSQLのほうで自動でやれるだけやってほしいのですが、 今は、 ******************************* Pt_createのほうに、種別:DATETIME Pt_updateのほうに、種別:TIMESTAMP、属性:on update CURRENT_TIMESTAMP PHP側にて、$today = date("Y-m-d H:i:s");を取得して、 新規作成時・・・ $sql = INSERT INTO (`Pt_create`) VALUES ('".$today."')・・ ******************************* ここまで省略できました。 これが限界でしょうか。 種別:TIMESTAMPを2つ設置したらうまく動作しなかったもので。

    • ベストアンサー
    • MySQL
  • TIMESTAMP型が含まれるテーブルの列名の取得

    Oracle 11gを使用しているSQL初心者です。 テーブルの列名を取得する方法についての質問です。 テーブルの列名を取得するときは以下のSQLで取れると思っています。 select column_name from user_tab_columns where table_name = 'テーブル名'; --実行結果-- COLUMN_NAME ------------------------------ NAME1 NAME2 しかし、テーブルにTIMESTAMP型が含まれていると 「レコードが選択されませんでした。」 と表示されます。 TIMESTAMP型が含まれるテーブルは上記のSQLでは取得できないのでしょうか。 TIMESTAMP型が含まれるテーブルの列名の取得方法をご存知の方がいらっしゃいましたら、 ご教示ください。よろしくお願い致します。

  • VBでSQL文のUPDATE文を使った時のエラー

    access VBA初心者ですが回答、ご指摘のほうよろしければお願いします。 フォームにて更新ボタン押下時、テーブルの更新日付を現在の日付で更新したいと考えております。 下記のようにVBを組み込んだのですが、実行すると「UPDATE ステートメントの構文エラーです」というエラーがでてしまいます。 構文のどこが悪いか御指南いただけないでしょうか。 test_TBLの更新日付のフィールドを現在日付で更新 Dim sql As String Dim newdate As Date newdate = Now() sql = "UPDATE test_TBL SET 更新日付 =#" & newdate & "#" DoCmd.RunSQL sql

  • PostgreSQLのテーブル構造を取得したい

    現在PostgreSQLとPHP5を利用してアプリケーションを開発しております。 PHPにて現在すでに存在するPostgreSQLのテーブルの定義情報を取得するにはどうすればよろしいでしょうか。テーブルの定義情報は下記のようにSQLのCREATE文で取得したいと思っております。 CREATE TABLE favorite ( code serial NOT NULL, reg_date timestamp without time zone NOT NULL DEFAULT now(), update_date timestamp without time zone, title text, url text, u_id character varying(20) NOT NULL, enabled_flag smallint NOT NULL DEFAULT 1, CONSTRAINT web_favorite_pkey PRIMARY KEY (fv_code) ) 何卒よろしくお願いいたします。

  • 時間帯テーブルから直近空き時間取得

    現在の日時を基準に下記テーブルより直近で空いている日付とその時間帯を求めるSQLを教えて下さい。 下記のjikan_tblは、未来の予定のレコードが登録されています。 1レコード目は、2013年9月27日10時から同日の10時15分までの予定のデータです。 15分間隔で予定のレコードを登録していますが、現在の日時が2013年9月27日の10時の場合、 直近で予定を入れられる時間帯を知りたいのでSQLで同日の10時45分から11時が空いていると取得できればベストです。 ちなみに同日の11時15分から11時30分と取得されてしまうのは、NGです。 jikan_tbl date_start int(8), time_start int(4), date_end int(8), time_end int(4) jikan_tblのレコード 20130927 | 1000 | 20130927 | 1015 20130927 | 1015 | 20130927 | 1030 20130927 | 1030 | 20130927 | 1045 20130927 | 1100 | 20130927 | 1115 20130927 | 1130 | 20130927 | 1140 難しく調べても分かりません。 知恵を貸して下さい。 宜しくお願いします。 os: windows 7 eclipse: Version: 4.2.0 Build SDK: Android 4.3(API 18) PHP 5

    • ベストアンサー
    • MySQL
  • identityの値の変更/自動更新について

    MySQLからWindowAzureに移行しています。 1.identityが設定されている値の変更 auto_incrementが使えないようなので、identityを使用して下記のテーブルを作成しました。 ですが、identityだと更新ができないので困っています。 CREATE TABLE test ( id int NOT NULL identity, text nvarchar(255) NOT NULL, PRIMARY KEY (id), ); データの追加に関しては、IDENTITY_INSERTをONにすることでできますが、更新時はどうすればよいでしょうか? データの追加の場合は、使用の際上記のように、毎回ONにする必要がありますか?(DB接続時にONにしてしまえばよい/テーブル作成時に記述で可能ではない?) 複数個所から更新をするので、すべての箇所に記述するのは可能な限りしたくありません。 2.データの自動更新 テーブルを更新した際に、データを自動で更新したいのですが、mysqlでは on update で可能ですが、 SQLAzureでは、下記のSQLをどのように記述すればよいでしょうか? create table time( id int not null, time1 datetime NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, PRIMARY KEY(id) ); よろしくお願いします。

  • VB.NET MDB(Access 2002) が更新されない

    簡単に作ったプログラムで MDB形式(Access) に用意したテーブル をTableAdaper でVB.netが自動生成したプログラム を実行してみたところ うまく更新されません。   参考:URL http://oshiete1.goo.ne.jp/qa1304483.html 他の方法をいろいろ試したがダメでした。 下記は二つの項目を画面に配置して自動生成されたものでs。 自分で書いたコードでOledbDataAdpter も実験してみたのですが結果は同じです。 メモリー上では更新されますが 物理的にはUpdateがされません。 一旦、画面をとじて開くと更新されていません。 なぜでしょうか? SQL Server ではこんなことはおきませんでした。 __________________________________________________________ Public Class TESTfm Private Sub TBL_交信記録BindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TBL_交信記録BindingNavigatorSaveItem.Click Me.Validate() Me.TBL_交信記録BindingSource.EndEdit() Me.TBL_交信記録TableAdapter.Update(Me.QSO_LOG_DATASET.TBL_交信記録) End Sub Private Sub TESTfm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'TODO: このコード行はデータを 'QSO_LOG_DATASET.TBL_交信記録' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 Me.TBL_交信記録TableAdapter.Fill(Me.QSO_LOG_DATASET.TBL_交信記録) End Sub Private Sub TESTfm_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed MAINMENU.Visible = True End Sub End Class ____________________________________________