

いつもお世話になっております。
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
postgresql についてです
-
dbFailOnError とは?
-
【DB】同じトランザクション内...
-
TPSとは・・・
-
PHP-オラクルでのトランザクション
-
肥大化しすぎたSQLiteがVACUUM...
-
SQL*Loaderのコミットポイント...
-
SQL SERVER2008の質問です
-
DATファイルをEXCELで開きたい
-
一つのテーブルだけを復元(リス...
-
エクセルのフィルタ抽出が固まる
-
SQLローダーで複数のCSVファイ...
-
VSAM,QSAM,BSAM,BPAM,BDAM
-
ファイルの存在チェック
-
ファイルへのアクセスでエラー...
-
新聞サイズの大きさのPDF化...
-
データベースが大きすぎてリス...
-
MS-Accessのエクスポートで異常...
-
32ビット版Officeで作成64ビッ...
-
警察はスマホに保存した動画や...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【DB】同じトランザクション内...
-
postgresql についてです
-
dbFailOnError とは?
-
TPSとは・・・
-
Accessdでの「トランザクション...
-
一つのトランザクションでSELEC...
-
汎用系システムのDBについて
-
ADO Connection を再利用する方法
-
SAPのSPROって何の略ですか?
-
OracleのROWIDについて…
-
PostgreSQLのクラスタ運用について
-
PHP-オラクルでのトランザクション
-
トランザクション
-
jmeterについて、教えてください。
-
こんなのがでたんですが…
-
BitcoinコアはPolygonチェーン...
-
INSERT分の処理速度がトランザ...
-
トランザクションの肥大化
-
ACCESSでの検索方法について
-
DBMSのロールフォワードについて
おすすめ情報