

いつもお世話になっております。
ADO.NETの話なのですが、トランザクションを開始したコネクションオブジェクトで
DataAdapterを使ったSELECTと、ExecuteNonQueryを使ったUPDATEを交互に繰り返し
行うことはできるでしょうか?
現状できていないので可能なのであれば共通関数の見直しが必要かと思っています。
いまはSELECTとUPDATEを別のコネクションで行っているのですが、UPDATE後に
同じテーブルの該当レコードをSELECTにいくため、デッドロックが発生しています。
No.3ベストアンサー
- 回答日時:
>それにしてもコネクションとトランザクションオブジェクトを別々に
>渡してやる必要性がよく理解できません。コネクションオブジェクトから
>トランザクションオブジェクトも参照できるのでは?と思うのですが・・・。
たしかに私も腑に落ちない・・・気がします
なにか別に設定が必要な理由があるのかも知れませんね
複数のトランザクションが存在する場合に指定が必要になるのかも!
私の過去のコードにはしっかり
sqlCommand.Transaction = tran
がありました(いつの間にか記述してたみたい)
すいません。#2ではまったくその事に触れていませんでした
憶測での回答になってしまいますが
トランザクションが割り当てられたコマンドが実行されたときに
自動的にBegin Tranされ
トランザクションが割り当てられていないコマンドが実行されたときに
自動的にCommit Tranが実行されてしまうのかも知れません
時間があったら実証して見たいと思います
No.2
- 回答日時:
実はあまり知られていないことなのですが
DataAdapterは複数のテーブルまたは全く関連のないテーブル、さらに同時に複数のテーブル、さらにさらにストアドプロシージャを指定してselect,update,insert,deleteを行うことが可能です
その方法は割愛しますが、ウィザードだけを使用していると見落としがちですね(笑
ただコーディング実装が難しい部類になるので上級者むけですが
1~4を全てDataAdapterだけで実現することも可能です。
更新の反映はDataAdapter.Update()だけで済むのですが
CommandオブジェクトとTableMappingの関連付けがやや難しいです
自信が無ければ上記は一度忘れて構いません
別の解決方法
1、DataAdapterのSelectCommandのConnectionをUpdateコマンドのConnectionに割り当てること
2、FillやUpdateを行う前にConnectionをOpenし全ての処理が終わってからCloseすること
何故そうするか?
DataAdapterのFillコマンドはSelectCommandのConnectionの状態をFill前と後で維持します。
冗長して説明するとFillする前にCloseである場合は自動的にOpenしてからFillの後に自動的にCloseします。逆にOpenである場合はFillのみ処理を行います。
ですのでFillを行う前にConnectionをOpenする処理が無ければFill後に一度Closeしようとするのでトランザクションがぶつ切りになる可能性があります。updateまで含めて一連のトランザクションしたいのであれば、わざわざ手動でConnectionをOpen・Closeする必要があります。
>DataAdapterをCloseしたら、ExecuteNonQueryも
>使えるようになるんですかね?
先の質問の答えはYesですが、一度CloseしてCommandオブジェクトのExecuteNonQueryを実行した場合はトランザクションの意味がなくなる可能性があります
アドバイスありがとうございます。
共通関数を使わずにDataAdapterとExecuteNonQueryを使ってみたところ、
トランザクションを開始した接続オブジェクトで問題なく動作しました。
共通関数の中身を確認したところ、データアダプター使用時に
Da = New SqlDataAdapter(strSQL, SqlCn)
と宣言していたのが問題だったようです。
トランザクションを開始した接続オブジェクトでデータアダプターを
使うには、下記のような形でトランザクションオブジェクトも指定して
やることが必要でした。
Da = New SqlDataAdapter
Da.SelectCommand = New SqlCommand(strSQL, SqlCn, Trans)
それにしてもコネクションとトランザクションオブジェクトを別々に
渡してやる必要性がよく理解できません。コネクションオブジェクトから
トランザクションオブジェクトも参照できるのでは?と思うのですが・・・。
No.1
- 回答日時:
可能です。
ただ疑問があります。なぜDataAdapterでUpdateの処理まで行わないのでしょう。
推測ですが。。。
DataTableに結合クエリでfillしているのであれば
UpdateCommand,InsertCommand,DeleteCommandを
自作する必要がありますが、同じようなことはできるかもしれません
この回答への補足
結合クエリというのはちょっと分からないのですが、
DataAdapterでUPDATEしない理由は、単純に1つの
テーブルをSELECTしてUPDATEするわけ
ではないことと、もう一つはSELECTしてくる共通関数
がUPDATEを考慮していないことが原因です。
(1)テーブルA から SELECT
(2)(1)のデータでテーブルB から SELECT
(3)(2)のデータでテーブルC に INSERT
(4)テーブルA をUPDATE
上記の処理を繰り返し行うようなロジックになっています。
DataAdapterをCloseしたら、ExecuteNonQueryも
使えるようになるんですかね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- Oracle SQL update方法 2 2022/06/22 14:07
- Excel(エクセル) vba 複数の行を非表示の時コードのまとめ方 3 2022/11/17 15:01
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Windows 10 Windows Updateが動作しません 7 2022/08/12 16:26
- セキュリティホール・脆弱性 ウィルス感染してしまいました。 3 2022/11/27 10:02
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Windows 10 数年前からWindows10 の Update ができないです。なぜですか? 7 2022/11/09 06:03
このQ&Aを見た人はこんなQ&Aも見ています
-
【DB】同じトランザクション内でupdateとselectをしたときの結果値
その他(データベース)
-
トランザクション中にSELECTした場合について
MySQL
-
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
-
4
ExecuteNonQueryメソッドの戻り値
その他(プログラミング・Web制作)
-
5
VBのソース上からAccessのmdbファイルのクエリを呼び出す
Visual Basic(VBA)
-
6
vb.netで画面のコントロールId名を変数で動的に制御し処理する方法
Visual Basic(VBA)
-
7
SELECT FOR UPDATE にトランザクションは必要ですか?
MySQL
-
8
エクセルで勝手に「折り返して全体表示」をされてしまいます!
Excel(エクセル)
-
9
VB.NETで小数点以下の桁数を取得したい
その他(ソフトウェア)
-
10
DataGridViewでyyyy/MM/dd
Visual Basic(VBA)
-
11
VB.Net リビルド 意味不明なメッセージが・・
Visual Basic(VBA)
-
12
VB.Net Object型 空かどうか
Visual Basic(VBA)
-
13
SQLで同じDBに対し2つのコネクションをもてる?
SQL Server
-
14
C#のループでtextboxに値を入れる方法
C言語・C++・C#
-
15
SELECT時の行ロックの必要性について
MySQL
-
16
SELECT文でのデッドロックに対しての対処方
SQL Server
-
17
VB.NET 自プログラムのプロセス終了のイベント
Visual Basic(VBA)
-
18
手動または分散トランザクションモード…のエラー
Visual Basic(VBA)
-
19
Chr(13)とChr(10)の違いは?
PowerPoint(パワーポイント)
-
20
VB.NET Excelを読み込んでDataTableに格納し、DBにデータをINSERTする
Microsoft ASP
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【DB】同じトランザクション内...
-
postgresql についてです
-
dbFailOnError とは?
-
一つのトランザクションでSELEC...
-
Accessdでの「トランザクション...
-
OracleのROWIDについて…
-
TPSとは・・・
-
SAPのfavoriteメニューを他のユ...
-
webサーバの推奨アクセス数...
-
汎用系システムのDBについて
-
エクセルのフィルタ抽出が固まる
-
MS-Accessのエクスポートで異常...
-
mdfファイルの残骸について
-
一つのテーブルだけを復元(リス...
-
SQL Server Management Studio ...
-
SQL ServerにExcelをリンクさせ...
-
PCが悪くなって新しいPCにSSMS...
-
復元に異常に時間がかかる
-
ACCESS2003での150人同時利用
-
SQL*Loaderのコミットポイント...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【DB】同じトランザクション内...
-
postgresql についてです
-
dbFailOnError とは?
-
一つのトランザクションでSELEC...
-
Accessdでの「トランザクション...
-
TPSとは・・・
-
OracleのROWIDについて…
-
ADO Connection を再利用する方法
-
汎用系システムのDBについて
-
トランザクションの肥大化
-
jmeterについて、教えてください。
-
SAPのSPROって何の略ですか?
-
PHP-オラクルでのトランザクション
-
webサーバの推奨アクセス数...
-
PostgreSqlについて
-
ロールフォワードとロールバッ...
-
トランザクション中に別のトラ...
-
平成23年 春期 基本情報技術者 ...
-
BitcoinコアはPolygonチェーン...
-
こんなのがでたんですが…
おすすめ情報