TableAdapter.Updateの戻り値

このQ&Aのポイント
  • TableAdapter.Updateを使用した場合、新規に登録したデータの主キーを取得する方法がわかりません。
  • TableAdapter.UpdateはUPDATEやINSERTなどの操作を簡単に行えますが、新規登録時の主キーの取得方法が分かりません。
  • TableAdapter.Updateの戻り値には反映した件数が返ってきますが、新規登録時の主キーを取得する方法が不明です。
回答を見る
  • ベストアンサー

TableAdapter.Update 戻り値

大変お世話になります。 開発環境 Visual Studio 2012 VB.Net SQL Server 2014 Windows フォームで各コントロールをBindingSourceにてバインドしております。 TableAdapter.Updateにて UPDATEやINSERTなどに関連づけられているストアドプロシジャーも正常に動作しております。 UPDATEやINSERTのストアドプロシジャーには戻り値として、主キーが返ってくるようになっております。 TableAdapter.Updateは楽に登録更新をしてくれるのは良いのですが、新規に登録した場合に主TableAdapter.Update の戻り値は 反映した件数だと思うのですが、キーとなる値をどのように取得するのかがわかりません。INSERTで登録してあるストアドプロシジャーで本来かえってくる値を取得することはできるのでしょうか? 大変難儀しております。 何卒よろしくお願い申し上げます。

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

  • ベストアンサー
noname#251971
noname#251971
回答No.1

質問意図をちゃんと捉えられているか若干微妙なところがありますが。。 おそらく、insertでレコード登録した際に、DB側で主キーの値が自動採番されるなどするのでその値を取得してローカルの情報を更新したい、というような内容かと想像します。 TableAdapter自体では無く、そのINSERT/UPDATE等で利用されるCommandクラスにはデータ登録の際に情報を戻す仕組みがあります。 それらの概要については以下などが参考になるかと思います。 https://msdn.microsoft.com/ja-jp/library/ks9f57t0%28v=vs.110%29.aspx https://msdn.microsoft.com/ja-jp/library/59x02y99%28v=vs.110%29.aspx ただ、上記に記載されている内容は少々状況が特定的過ぎて、すぐにはわかりずらいかと思いますので多少一般化した(つもりの)補足を記載します。 まず、CommandクラスのParametersにはParameterDirection.OutputやParameterDirection.ReturnValueのパラメータによって(もちろんクエリ側も値を戻すように書いて)出力値を取得する事が出来ます。 また、ParameterはDataColumnと対応させることができます。(DataTableなどでUpdate()をする場合、ParameterDirection.Inputのパラメータでは普通に行っているかと思います) 上記に加え、CommandのUpdatedRowSourceプロパティにてOutputParametersを設定することで、クエリの出力をDataTable(DataRow)に取り込むことが出来ます。 質問者さんが現在利用しているINSERT/UPDATEに利用しているストアドが具体的にどのように値を返すかわかりませんが、戻り値とあるのでもしかするとParameterDirection.ReturnValueを使うパターンかもしれません。 ちなみに当方は、returning句を利用してDB側で採番したIDとCREATEやMODIFY日時などを登録と同時に取得する、といった形で良く利用しています。 また、ついでに記載しておきますと、UpdatedRowSourceにFirstReturnedRecordを指定すると、出力パラメータではなくselect結果によるデータの反映(取得)を行うことが出来るようです。(実際に自分で使ったことはないですが) これは、INSERTのクエリで「insert into **** values(**); select **** from ***;」といった感じで、1つのコマンドで更新したレコードをselectして値を戻す(あるいは良く知りませんがそのほかの方法でレコードが返るようなクエリを指定する)といったような使い方になるようです。 またあるいは、ラウンドトリップ数の多少の増加やデータ転送量が気にならないような場合で、必要なデータを特定出来るのであればselect(Fill)し直す手もあるかとは思います。

kyokotan12
質問者

お礼

toras9000様、お世話になります。 説明不足で申し訳ございませんでした。 ご指摘通りDBから自動採番されたIDの取得が目的でございました。 ご紹介いただいたURLからいろいろな事が勉強できました。 Adapterのパラメータやメソッドの奥深さの片鱗を実感できました。 Insertの場合の戻り値は下記の記述で取得することができました。 Adapter.InsertCommand.Parameters("@RETURN_VALUE").Value.ToString 大変勉強になりました。 ありがとうございました。

関連するQ&A

  • BindingSourceでの更新や登録

    お世話になります。 開発環境:Visual Strudio 2012(VB.Net) DB:SQl Server 2008 OS:Windows 7 WindowsフォームやDataView のデータソース元として TableAdapter(ストアドプロシジャー)を作成しました。 また、その際にコマンドを既存のストアドプロシジャーに登録する箇所で、 Insert , UpDate, Delete として各ストアドプロシジャーを作成し登録しました。 WindowsフォームやDataViewのデータソースをそのTableAdapterで作成して できたBindingSourceにしている場合に、たとえば BindingSource.RemoveAt(10)など で見かけ上データを削除した時でも コマンドで登録したDeleteのストアドプロシジャーが 実行されず、再びフォームを開くと消したはずのデータが表示されます。 TableAdapterでコマンド登録した各ストアドプロシジャーは 新規登録、更新、削除を行った場合、どのようにすれば実行させることができるのでしょうか? そんなことはできない や こうすればよいなどの情報がございましたら何卒ご教授いただければと思っております。 よろしくお願い申し上げます。

  • VB.Net TableAdapterで登録してい

    お世話になります。 VB.Net 駆け出しの者です TableAdapter に登録してあるストアドプロシジャーをよく実行しますが、 Dim Ret Integer Ret = Me.問題のTableAdapter.問題の関数(引数) こんな感じで実行しますが、実行後の戻り値は1か0の 反映した件数?!が帰ってきると思われるのですが、ストアド内のReTurn で返している値を取得するにはどうしたらよいのでしょうか? 例えば、ストアドプロシジャーの最後の部分で、下記のようにオートナンバーのキーを取得したい場合、ReturnValue の値を取得したいことってあると思うのですが、こういう場合、TableAdapter.関数の記述でReturnValue の値を取得するためにはどのような記述をすればいいのでしょうか? 何卒よろしくお願いいたします。 SET @Ret = @@IDENTITY COMMIT TRANSACTION RETURN @Ret END TRY BEGIN CATCH ROLLBACK TRANSACTION RETURN 0 END CATCH

  • oracle10g update件数の取得方法

    oracle10g update件数の取得方法 pl sql(stored procedure)で複数のupdate文を適用します。update後にupdateしたレコード件数をログテーブルにinsertしたいのですが、updateしたレコード件数を取得する方法はありますか?

  • VB.netのTableAdapter.Inser

    VB.netについて質問です。 TableAdapter.InsertQueryについて質問になります。 ・データセットに紐づいているDataGridViewからTableAdapter.InsertQueryを利用してDBに登録したい。 ・DBに登録されているIDcodeデータとDataGridViewのIDcodeデータを比較し、DataGridViewのIDcode重複データは除いてDBに登録したい。 (1)現在のコードですと同じものを再度登録すると主キーエラーが出てしまいます。 DBではIDcodeを主キーにしております。 (2)SQLでWHERE NOT EXISTS文をいれている(重複ははじいているつもり)のですがダメです。 皆様のお知恵をお貸しください。 【DBのカラム】 date, IDcode 【現在のコード】 If TableDataGridView.RowCount = 1 Then MsgBox("登録するデータがありません") Else For Each dr As DataRow In DataSet1.Tables(0).Rows Me.TableTableAdapter.InsertQuery(dr("date"), dr("IDcode")) Next Me.Close() End If 【InsertQuery(@date, @IDcode)の中身】 INSERT INTO [dbo].[Table] ([date], [IDcode]) VALUES (@date, @IDcode); SELECT date, IDcode FROM [dbo].[Table] WHERE NOT EXISTS(SELECT * FROM [dbo].[Table] WHERE [IDcode] = @IDcode) order by IDcode どうぞよろしくお願いいたします。

  • TableAdapter insert updateについて

    TableAdapter insert updateについて 開発環境 VB2008 / ACCSESS 単純な内容ですが、ほぼ初心者の私は困ってしまいました。 商品のマスタメンテナンスを作っています。 画面の項目は、商品コードを商品名です。 データ追加は shohinTableAdapter.insert(txtshohin_cd.text, txtshohin_name.txt) で動いています。 すでに登録されているデータを呼び出し、更新するのがどうしてもできません。 商品コードについてはキー項目ですので、実際に変更がかかるのは商品名だけです。 shohinTableAdapter.update でうまくいくのでしょうか? 質問内容を読んでお気づきかと思いますが、全くと言っていいほど初心者です。 どう説明すればいいのかもわかっていません・・・・ 申し訳ありません。 こんな質問内容でも、回答を頂ければ助かります。 よろしくお願いします。

  • ON DUPLICATE KEY UPDATE

    こんにちは。 PHP + MYSQL でシステム構築をしております。 この度は、新しいレコードを INSERT するが、もしもINSERT するレコードのうちの主キーが既に存在する場合は、UPDATE を行うという処理をしたいと思っています。 調べているうちに MySQL 4.1.0 の新機能である ON DUPLICATE KEY UPDATE 節というものがありましたが、4.1.0以前の MYSQL を利用の場合はどのようにするのが最適でしょうか? 私が考えたのは、挿入前に主キーを持つレコードを読み込んで、レコードが返ってこなかった場合は INSERT、何かレコードが返ってきた場合は UPDATE というようにする方法ですが、少し回りくどい気もします。 クエリのみで、またはシンプルな方法でこれを解決する方法はありますでしょうか? ご教授お願いいたします。

    • 締切済み
    • PHP
  • DBのinsert/updateを1ボタンでできる方法

    スケジュール登録などで1つのボタンで スケジュールを新規登録する機能(insert)とスケジュールを更新する機能(update)を兼ねる場合どのように実装したらいいでしょうか?以下のやり方以外で、効率よくできる方法を知りたいです。どうかよろしくお願いします。 <実装例概略> ・フォームから値をとってくる。 ・その値がdbにはいっているか(select文)を調べる。 ・値がdbにはいっていればupdate文、dbにはいっていなければinsert文を発行する。 os:winxp(professional) db:Oracle9i

  • 関数戻り値が連想配列の場合

    こんにちわ。 PHP5について質問です。 あるユーザ関数の戻り値が連想配列である場合、 ユーザ関数の実行~戻値の特定のキーの値を取得 までを1行で取得する方法があれば教えてください。 例) function hoge() {  return array("fuga" => "1", "moge" => "2"); } ここで"moge"の値を一発で参照したいと考えています。 通常では、 $result = hoge(); print $result["moge"]; のようにしていますが、これを一行で実現できる方法はありますでしょうか。

    • ベストアンサー
    • PHP
  • 複数updateする時に・・・

    やりたい事: 複数レコードのある項目を1度にupdateたい。 現在のA項目の最大値に+1した値から順にインクリメントした値を入れたい。 例: sampleというテーブルにkey,dataという項目があったとします。 update前 >>> update後 key|data______key|data --+----______--+---- _A_|_1___________A_|_1_ _B_|_2___________B_|_2_ _C_|_3___________C_|_3_ _A_|_0___________A_|_4_ _A_|_0___________A_|_5_ _A_|_0___________A_|_6_ (スペースが入らなくて_にしました見にくいですが) 同じ値をupdateするなら update sample set data=値 where key=A and data=0 これを update sample set data=MAX(data)++ where key=A and data=0 みたいに書けたらいいなぁと思うのですが、1度該当レコードをselectして取得した値を条件に順番に1行づつupdateしないとだめですかね・・・ ちなみに環境はRedHat7.0J上のPostgreSQL7.0.2 です。

  • 別のテーブルの値でUPDATEしたいのですが

    Oracle8iデータベースのSQL文で困っています。 以下のような2つの表があります。 ※表の構成は似ていますが、同じではありません。 [表A]  列1 ・・・ 主キー  列2 ・・・ 主キー  列3  列4 [表B]  列1 ・・・ 主キー  列2 ・・・ 主キー  列3  列4 表Aと表Bの主キーが一致するデータについて、 表Aを表Bの値でUPDATEしたいのですが、 どのように記述すればよいでしょうか? よろしくお願いします。