• ベストアンサー
  • すぐに回答を!

TableAdapter.Update 戻り値

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

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数803
  • ありがとう数2

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

  • ベストアンサー
  • 回答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)し直す手もあるかとは思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • 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

  • 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でコマンド登録した各ストアドプロシジャーは 新規登録、更新、削除を行った場合、どのようにすれば実行させることができるのでしょうか? そんなことはできない や こうすればよいなどの情報がございましたら何卒ご教授いただければと思っております。 よろしくお願い申し上げます。

  • TableAdapter insert updateについて

    TableAdapter insert updateについて 開発環境 VB2008 / ACCSESS 単純な内容ですが、ほぼ初心者の私は困ってしまいました。 商品のマスタメンテナンスを作っています。 画面の項目は、商品コードを商品名です。 データ追加は shohinTableAdapter.insert(txtshohin_cd.text, txtshohin_name.txt) で動いています。 すでに登録されているデータを呼び出し、更新するのがどうしてもできません。 商品コードについてはキー項目ですので、実際に変更がかかるのは商品名だけです。 shohinTableAdapter.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 どうぞよろしくお願いいたします。

  • SQL Server(MSDE2000) : ALTER TABLE

    SQL Server(MSDE2000) : ALTER TABLE した項目に対し、直後に UPDATE で値をセットできない 既存のテーブルを仕様変更するため、列を追加し、初期値で埋める SQL 文を書こうとしていますが、うまく動かず、エラーとなってしまい、原因が判らず困っています。 サンプル SQL 文: ------ CREATE TABLE TEST_TABLE ( TEST_FIELD1 SMALLINT, TEST_FIELD2 SMALLINT) INSERT INTO TEST_TABLE VALUES( 1, 2 ) ALTER TABLE TEST_TABLE ADD TEST_FIELD3 SMALLINT UPDATE TEST_TABLE SET TEST_FIELD3 = 3 ------ ※テスト毎に、必ず DROP TABLE TEST_TABLE されている事が前提です。 上記 SQL 文のうち、1行目~3行目までを抜粋して実行すると、ちゃんと CREATE TABLE され、INSERT され、ALTER TABLE される事を確認しました。 ところが、4行目までを一気に実行しようとすると、 ------ SQL実行中に以下のエラーが発生しました。 エラーコード:207 [Microsoft][ODBC SQL Server Driver][SQL Server]列名 'TEST_FIELD3' は無効です。 SQLステータス:S0022 ------ となってしまい、UPDATE で初期値を埋める事ができません。 しかも、UPDATE に失敗するどころか、2行目の INSERT から以降が結果に反映されなくなるという状況に陥ってしまいます。 また、既存のテーブルの仕様変更が目的なので、その状況に近づけるために、まず、 ------ CREATE TABLE TEST_TABLE ( TEST_FIELD1 SMALLINT, TEST_FIELD2 SMALLINT) INSERT INTO TEST_TABLE VALUES( 1, 2 ) ------ を実行し、既存のテーブル(とレコード内容)が存在する状態を作り出された事を、ツール等で確認してから、 ------ ALTER TABLE TEST_TABLE ADD TEST_FIELD3 SMALLINT UPDATE TEST_TABLE SET TEST_FIELD3 = 3 ------ の2行を実行してみると、やはり UPDATE は失敗し、前述と同じエラーが発生します。 またこの場合、ALTER TABLE の実行結果も反映されていません。(つまり、TEST_FIELD3 が列追加されていない) もちろん、ALTER TABLE だけを実行した場合には、ちゃんと列は追加されます。 その後に、UPDATE を実行すれば、ちゃんと追加列に初期値がセットされます。 どうやら、「一回の SQL 文の実行の中で、ALTER TABLE によって新設した列に対しては、UPDATE などでのアクセスはすぐにはできない」のではないか?という状況のようなのです。一回の SQL 文の実行の中において、何らかのトランザクション動作っぽい挙動を感じます。 つまり、ALTER TABLE で追加された列は、その時点ではまだ完全にシステムに認知されていないため、直後の UPDATE 文で認識できずに失敗するのではないか?と。そして、そこでのエラー発生が、ロールバック的に実行した処理をキャンセルしてしまうため、結果として、ALTER TABLE が実行されなかった事になったり、INSERT が実行されなかった事になったりしているのではないか?と思う次第です。 考えられる回避策としては、SQL 文を別々に作成し、個別に実行すれば良いだけの事なのですが、できれば、SQL 文一つにまとめたいと考えています。 どなたか、こういった現象に対する原因・理由の説明、或いは回避策など、何か情報をお持ちの方はいらっしゃいませんでしょうか? 宜しくお願いします。

  • ストアドプロシージャの戻り値が取得できない

    ストアドプロシージャの戻り値が取得できない ストアドプロシージャ内でSelectとUpdateを行い、設定した戻り値をリターンしたいのです。 ついでにSelectとした複数行の結果の読み込みもしたいのですが。 Dim cmd As New System.Data.SqlClient.SqlCommand Dim i As Integer Dim readerA As System.Data.SqlClient.SqlDataReader cmd.CommandType = Data.CommandType.StoredProcedure cmd.CommandText = "SP名" cmd.Parameters.Add("A", System.Data.SqlDbType.Int) cmd.Parameters("A").Direction = System.Data.ParameterDirection.ReturnValue readerA = cmd.ExecuteReader() i = cmd.Parameters("A").Value if (i = 0) Then 処理 End If While readerA.Read() 処理 End While 上記でSelectした結果をreaderA("カラム名") で読みこめているのですが、戻り値Aの値が取得できていません。 ウォッチ式でcmd.Parameters("A").Valueを見るとNothingになっています。 ちなみに、違うストアドを実行しているところでは戻り値は取得できています。。。 ストアドがおかしいんでしょうか。Selectの取得結果も見ようとしているのがまずいのでしょうか。 環境はvb.net、SQLServer2005です。

  • DBのinsert/updateを1ボタンでできる方法

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

  • Visual Studio2012 SQL2014

    お世話になります。 Visual Strudio 2012 で VB.Netで開発をしております。(以降VS) 最近、SQL Server 2014 をサーバーにインストールいたしまして、VSの SQL Server オブジェクトエスクプローラーにて SQL Server 2014接続させ(接続までは出来ました)、そこから展開させようとしてもオブジェクトのツリーが表示されず、最新の情報に更新を実行すると、『オブジェクトの現在の状態に問題があるため、操作は有効ではありません。』と表示されてしまいます。VSをコンパイルしてSQL Server 2014とのデータ連携はきちんとされており、正常に動作いたします。ですが、開発の際にテーブルの項目の追加、ストアドプロシジャーなどの作成など、いちいちサーバー側で作成しなくてはならないのが面倒で仕方ありません。ちなみに、サーバーには SQL Server 2005 ,2008もインストールされており、両方とも SQL Server オブジェクトエクスプローラーで表示、展開ができ、テーブルの作成から項目の追加、ストアドプロシジャーなどもきちんと作成が可能です。VS2012 と SQL Server 2014の相性が悪いのでしょうか?SQL Server オブジェクトエクスプローラーで、2005、2008同様にテーブル、ストアドプロシジャーの作成をしたり、項目の追加をしたいのですが、どうすればよいでしょうか?皆目見当がつかないで難儀しております。もしかして、VS 2012 と SQL Server 2014は 2014の方が新しいから VS2012では編集不可などということがあるのでしょうか?(AccessではAccessのヴァージョンより新しいSQL Serverの編集ができません) お分かりになる方がいらっしゃいましたら、どうかお知恵をお借りできれば幸いでございます。何卒よろしくお願い申し上げます。

  • LOCK TABLE

    登録処理、更新処理、削除処理を行う際に 他ユーザからのアクセスを制限するために 登録、更新、削除処理を行う前にロック処理を行おうと思っています。 その際にテーブルのロックがすでにしている場合や テーブルのロックに成功した、テーブルのロックに失敗 した場合に戻り値を返すのでしょうか? お分かりになる方よろしくお願い致します。 一応イメージとして LOCK TABLE テーブル名称 IN SHARE ROW EXCLUSIVEの処理の後 UPDATE文や、INSERT、削除などを行おうと思っています。 よろしくお願い致します。

  • SQLServerMangementStudio

    SQL Server Mangement Studioを使って開発をしているのですが データの新規登録や編集をinsert文やupdate文を使わずに GUIでデータを入力して追加登録や編集を行う方法はないでしょうか insert文やupdate文をいちいち作ってデータを挿入していたのでは 時間がかかります。 SQL Server Mangement Studioの機能でそういった事をする方法を 具体的に教えてください。 仕様しているソフトは下記になります sql Server management studio 9.0.0 SQL server 2005