• 締切済み

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

みんなの回答

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

調べればすぐ分かりそうな内容ですが、私自身が TableAdapter を 使わないので、以下のキーワードで検索される、幾つかのサイトの 内容に目を通し、検証してみてください。 検索キーワード「tableadapter ストアドプロシージャ 戻り値」 ざっと見た感じでは Parametersプロパティの「@RETURN_VALUE」というパラメータにセット されているが、protected で外部に公開されていないから、公開する ような関数を自作で追加する必要があるっぽいですね。

kyokotan12
質問者

お礼

MARU4812 さん お世話になります。 お礼が大変遅くなりました。 Parametersプロパティがprotected をパーシャルにしてという記事はすでに拝見していたのですが、VB.Netで、どのような記述すればよいのか、駆け出しの者にはかなり敷居が高かったでした。 C#か何かで記述されていたものも拝見したのですが、かなり難しいコードだったので、手が出せずじまいでした。 なんとか暇を見つけて実装に向けて頑張ってみます。

関連するQ&A

  • VB5+SQL2000での ** TRANSACTIONについて(ADO)

    環境:VB5(SP3)+SQL2000(SP1) VBで、BEGIN TRANSACTIONを定義し、その後更新用DBを更新する前に、ストアドプロシージャを利用せずDBを検索した場合、問題無く更新用DBへの更新に対して(ROLLBACK/COMMIT) TRANSACTION が効くのですが、ストアドプロシージャで検索した場合、(ROLLBACK) TRANSACTION が効きません。 分かりづらいですがサンプルを記します。 Function Test() Dim MyRs As New ADODB.Recordset Dim MyRs2 As New ADODB.Recordset : MyDB.Execute "BEGIN TRANSACTION TEST999",,adCmdText+adExecuteNoRecords : '(A)不具合未発生パターン 'レコードセットを開く 'このように、レコードセットを作成した場合問題なし。 MyRs.Open "SELECT * FROM TESTDB..テスト",MyDB,adOpenStatic '(B)不具合発生パターン 'ただし、上のSELECT文をストアドプロシージャで開いた場合、ROLLBACKが効かない 'レコードセットを開く(正常に(ROLLBACK)TRANSACTIONが動作せず、UpDate時にCommitしている) 'MyRs.Open "TESTDB..TEST001",MyDB,adOpenStatic : MyRs2.Open "SELECT * FROM TESTDB..更新テスト",MyDB,adOpenKeyset,adLockPessimistic If Err <> 0 Then 'Error処理 End If If MyRs2.EOF Then MyRs2.AddNew MyRs2![FLD1] = MyRs2![FLD1A] Else MyRs2![FLD1] = "TEST" End If MyRs2.UpDate 'ここは正常終了。(Err = 0) 'テスト用にエラー設定 Err = 1 if Err <> 0 then '(B)不具合発生パターンの場合、ROLLBACK をしても、DBに登録されてしまう。 MyDB.Execute "ROLLBACK TRANSACTION TEST999",,adCmdText+adExecuteNoRecords Exit Function End If MyRs.Close MyRs2.Close SmileDB.Execute "COMMIT TRANSACTION TEST999",,adCmdText+adExecuteNoRecords End Function

  • トランザクションについて

    トランザクションについての質問なのですが、下にある1のSQLを実行すると 'a'だけ登録されるのは、分かるのですが、 2のSQLを実行すると、'c'と'd'の両方が登録されてしまいます。 私的には、両方登録されないのかなぁと思っていたのですが・・・ COMMITが来た時点で、START TRANSACTIONの開始位置は、 あまり関係ないということなのでしょうか? よろしくお願いします。 1. START TRANSACTION; insert into test values('a'); START TRANSACTION; insert into mtuser values('b'); ROLLBACK; COMMIT; 2. START TRANSACTION; insert into test values('c'); START TRANSACTION; insert into mtuser values('d'); COMMIT; ROLLBACK; 環境:Mysql4.1.19

    • ベストアンサー
    • MySQL
  • TableAdapter.Update 戻り値

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

  • postgresqlのトランザクションについて

    開発環境(centOS、apatch、php、postgresql) postgrsqlで「current transaction is aborted, commands ignored until end of transaction block」 のエラーが出てしまいました。 ・複数テーブルに対してinsertを行っています。 ・複数tableのinsert中のどこかでエラーになった場合、全tableをrollbackしたいです。 ・複数テーブルのうち、ひとつのtableでは5回insertを行っています。   for文でまわしているのですが、ここで2回目のinsertの時に   上記のエラーになってしまいます。 で、トランザクション(begin、rollback、commit)を全てはずしたところ、全てのtableで正常にinsertできました。 上記のエラーを調べてみても rollbackしていない・・・みたいなことしか調べられませんでした。 エラーにはなっていないのでrollbackはしないし、ここでcommitしてしまうと、次のinsertなどでエラーになった時、rollbackできなくなってしまうし。。。 上記のエラーをなくすために どのような対策をすればいいのかアドバイスをお願いいたします!

  • SQL実行エラー時のロールバックについて

    クエリアナライザを使用し、以下のような複数のステートメントを実行するクエリを流します。 「BEGIN TRANSACTION TRAN_X INSERT文1; INSERT文2; UPDATE文3; …」 最終的に成功したら commit、途中でエラーが出たらrollbackしたいと考えています。 @@ERRORでなくJAVAでいう「try~catch」またはVBでいう「ON ERROR」構文のようなものはないのでしょうか? どなたかご教授お願いします。

  • アスペクト指向によるトランザクションの記述のサンプル

    PHP5.2.4を使用しています。 Sabelフレームワーク内でのトランザクションの記述のサンプルというか例を 教えて頂きたいのですが、以前はHPが見れてそのサンプルを見れたような気がするのですが、 今はアクセスできる状態じゃなく(http://www.sabel.jp/)コミュニティのようなものもあるわけではないので ここで質問させて下さい。 app/logics/aspects/Transaction.php class Logics_Aspects_Transaction implements Sabel_Aspect_MethodInterceptor { public function invoke(Sabel_Aspect_MethodInvocation $inv) { if (!$active = Sabel_Db_Transaction::isActive()) { Sabel_Db_Transaction::activate(); } try { $result = $inv->proceed(); if (!$active) { Sabel_Db_Transaction::commit(); } return $result; } catch (Exception $e) { if (!$active) { Sabel_Db_Transaction::rollback(); } throw $e; } } } 詳しくは分からないのですがここにトランザクションのロジックがあるようなのですが、 これを例えばデータベースのデータを保存するさいにどのような記述で使えばよいのか というサンプルを示して頂けないでしょうか? ここでダウンロードができます Sabel ドキュメントとか(非公式) http://ebine.org/sabel/doc/index.html

    • ベストアンサー
    • PHP
  • ActiveX DLLでのオラクルのトランザクション

    VB6とOracle9iのOO4Oにてシステムを構築しておりますが、一つ解らないことがありましたので、どなたかご教授願います。 あるPG(通常のEXEです)よりActiveX DLLを呼び出してOracleの表へデータを挿入する処理があります。呼び出し元となる通常のEXEはまずOracleの接続処理を記述しています。正常に接続が完了したならトランザクションを開始し、表のDeleteを実行します。その後ActiveX DLLを呼び出して表のInsertを実行しています。再び通常のEXEに制御が戻り、トランザクションの完了(COMMIT)または破棄(ROLLBACK)を行います。しかし、最後のトランザクションのCOMMIT(ROLLBACK)を行うと『コッミト(ロールバック)時にアクティブなトランザクションがありません』というエラーが発生してしまいます。正しくBegin Transactionを実行しているのに、これはどういうこと何のでしょうか。ご存知の方がいらっしゃましたら教えてください。

  • DLL VBとC++

    VBAからVC++2005のDLLを呼び出すプログラムを書いています。 VB側で作成したcpp_proc関数を呼ぶとVBアプリ自体が落ちました。 DLLのreturnの直前に以下のMessageBoxで表示させるとそこまでは表示され、 リターンを押すと、落ちました。 VB側の引数の値 String * 8192が悪いのでしょうか? return直前まで動作していたので、DLLの戻り値に何か原因があるのでしょうか? ついでの質問ですが、DEFの @1は無くても動くのでしょうか? 意味が知りたいです。 // ----- C++ (DLL側) ----- int __stdcall cpp_proc(LPCSTR inp, LPSTR out) { ... 省略 MessageBox(0, "ここまで通過", "debug", MB_OK); return 0; } // ----- DEF ----- LIBRARY "example" DESCRIPTION 'テスト' EXPORTS ; 明示的なエクスポートはここへ記述できます cpp_proc @1 '----- VB側 ----- Public Declare Function cpp_proc Lib "example.dll" _ (ByVal inp As String, ByRef out As String) As Integer Public Sub Test() Dim ret As Integer Dim inp As String Dim out As String * 8192 ret = cpp_proc(inp, out) MsgBox("ret=[" & Cstr(ret) & "]"); End Sub

  • select実行時のロックとcommitについて

    お世話になっております。 WEB上で検索すると、select実行時にもロックを取得しcommitもしくはrollbackを実施していることがわかりました。 そのことについて数点疑問を持ち調査したのですが、わかりませんでした。 どなたかわかる方ご教示ください。 (1) select発行時にロックを取得しcommitもしくはrollbackするという認識は正しいでしょうか。 (2) 通常SQLに不備が無ければselectは正常に終了すると思いますが、 rollbackするのはどのような状況でしょうか。 selectのSQLに不備があった場合でしょうか。 (3) コンソールからselectを発行するとcommitせずとも結果が出力されます。 このcommitされるタイミングはいつになるのでしょうか。 (4) WITH URオプションを使用するとロックを取得しないと思いますが、 ロックを取得しないということはcommit/rollbackも実施されないという認識は正しいでしょうか。 (5) commitコマンドを発行するとアクティブログに追記されるという認識なのですが、 WITH URオプションなしでselect文を発行してもアクティブログに追記されるものでしょうか。 それともテーブルの更新など実施しないので、アクティブログは更新されないのでしょうか。 (6) WITH URオプションをつけてSELECTを実施した場合はアクティブログは更新されないでしょうか。 (7) EXPORTコマンドを実行した場合も(5)(6)と同様という認識で正しいでしょうか。 以上になります。 よろしくお願いいたします。

  • トランザクションが原因?DBにデータ追加出来ません

    言語:PHP Framework:symfony DB:MySQL DBにデータを追加したいのですが、 [Rollback failed. There is no active transaction.] といったエラーが表示され、追加することが出来ません。 【ソース】 ------------------------------------------------------ try { $connection->beginTransaction(); ★DB追加処理; $connection->commit(); } catch (Exception $e) {   // ここで[Rollback failed. There is no active transaction.]というエラーが表示されます echo $e->getMessage(); $connection->rollBack(); } ------------------------------------------------------ DB追加処理の部分でエラーとなり、catchに飛ばされていたので、初めは追加の方法が間違っているのかと思ったのですが、下記の3つをソースから外すと正常に追加されました。 $connection->beginTransaction(); $connection->commit(); $connection->rollBack(); ※正確に言うと「$connection->beginTransaction();」を外すだけで追加出来ました。 また、これは私の勘違いかもしれませんが、初めてこの処理を行った時は正常にDBに追加されました。 実際にDBにデータが入ったのを確認しています。 ですが、2回目以降?からは、上記のように[Rollback failed. There is no active transaction.]というエラーが表示され、追加出来なくなりました。 ちなみにDB接続にはPDOというものを使用しているようです。 追加処理の部分に関してはSymfonyの方法で、下記のように実装しています。 ------------------------------------- $user = new T_USER(); $user->setName($name); $user->setAge($age); $user->save(); ------------------------------------- 何かヒントになるようなことでも構いませんので、分かる方がいらっしゃいましたらよろしくお願いします。 質問の内容に不備な点がございましたら、申し訳ありません。 以上です。

    • ベストアンサー
    • PHP

専門家に質問してみよう