質問: tableadapter.update 戻り値 大変お世話になります。 開発環境 visual studio 2012 vb.net sql server 2014 windows フォームで各コントロールをbindingsourceにてバインドしております。 tableadapter.updateにて updateやinsertなどに関連づけられているストアドプロシジャーも正常に動作しております。 updateやinsertのストアドプロシジャーには戻り値として、主キーが返ってくるようになっております。 tableadapter.updateは楽に登録更新をしてくれるのは良いのですが、新規に登録した場合に主tableadapter.update の戻り値は 反映した件数だと思うのですが、キーとなる値をどのように取得するのかがわかりません。insertで登録してあるストアドプロシジャーで本来かえってくる値を取得することはできるのでしょうか? 大変難儀しております。 何卒よろしくお願い申し上げます。
回答: 質問意図をちゃんと捉えられているか若干微妙なところがありますが。。 おそらく、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)し直す手もあるかとは思います。