![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_05.png?5a7ff87)
いつもお世話になっております。
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をしたときの結果値
その他(データベース)
-
複数SQL発行について
Visual Basic(VBA)
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
-
4
コミット前の更新データをチェックするには?
Java
-
5
DataTableに入っているデータを全てinsertしたい!(C#)
Microsoft ASP
-
6
同一トランザクションの中でテーブルの更新結果を参照できるか?
SQL Server
-
7
トランザクション中にSELECTした場合について
MySQL
-
8
CloseとDisposeの違い
Visual Basic(VBA)
-
9
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
10
vb.netで画面のコントロールId名を変数で動的に制御し処理する方法
Visual Basic(VBA)
-
11
SELECT 文 GROUP での1件目を取得
SQL Server
-
12
テーブルの最後(最新)のレコードを抽出したい
MySQL
-
13
<VB.NET>INSERT文でDBにデータを入れたい
Visual Basic(VBA)
-
14
オラクルではできるのにSQLSERVERではサブクエリーで複数キーを指定できない?
SQL Server
-
15
VB2008で定数に色の設定をしたいです。(初心者)
Visual Basic(VBA)
-
16
VBの「As String * 128」とは?
Visual Basic(VBA)
-
17
VB.NETからVBAマクロ(引数)を呼び出す方法
Visual Basic(VBA)
-
18
VB.NETで小数点以下の桁数を取得したい
その他(ソフトウェア)
-
19
Accessdでの「トランザクションが多すぎる」エラーとは何?
その他(データベース)
-
20
小数点を含む数値かどうか判断の判断方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【DB】同じトランザクション内...
-
TPSとは・・・
-
SQL Server 2005トランザクショ...
-
dbFailOnError とは?
-
Accessdでの「トランザクション...
-
SAPのSPROって何の略ですか?
-
accessVBAでのワークスペース
-
postgresql についてです
-
警察はスマホに保存した動画や...
-
ACCESSのデータをWebブラウザで...
-
accessの処理が遅い
-
DATファイルをEXCELで開きたい
-
マスタメンテとは?
-
一つのテーブルだけを復元(リス...
-
エクセルのフィルタ抽出が固まる
-
ファイルの存在チェック
-
1回目の実行に3分、2回目の実行...
-
テキストで空欄(null?)を検索...
-
復旧中のデータベースについて
-
MS-Accessのエクスポートで異常...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【DB】同じトランザクション内...
-
postgresql についてです
-
Accessdでの「トランザクション...
-
TPSとは・・・
-
一つのトランザクションでSELEC...
-
SAPのSPROって何の略ですか?
-
ADO Connection を再利用する方法
-
dbFailOnError とは?
-
OracleのROWIDについて…
-
SQL Server 2005トランザクショ...
-
ロールフォワードとロールバッ...
-
PHP-オラクルでのトランザクション
-
PostgreSQLのクラスタ運用について
-
INSERT分の処理速度がトランザ...
-
jmeterについて、教えてください。
-
DBMSのロールフォワードについて
-
Sql Server 2005 でデータ抜け...
-
【データベースとファイル操作...
-
accessVBAでのワークスペース
-
ASPを用いてSQLServerからのデ...
おすすめ情報