いつもお世話になっております。
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
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
5
同一トランザクションの中でテーブルの更新結果を参照できるか?
SQL Server
-
6
コミット前の更新データをチェックするには?
Java
-
7
DataTableに入っているデータを全てinsertしたい!(C#)
Microsoft ASP
-
8
トランザクション中にSELECTした場合について
MySQL
-
9
ExecuteNonQueryメソッドの戻り値
その他(プログラミング・Web制作)
-
10
vb.netで画面のコントロールId名を変数で動的に制御し処理する方法
Visual Basic(VBA)
-
11
【VB】タブ切り替え時のイベント
Visual Basic(VBA)
-
12
オラクルではできるのにSQLSERVERではサブクエリーで複数キーを指定できない?
SQL Server
-
13
DataGridViewのセル編集完了後に値を設定するには
Visual Basic(VBA)
-
14
<VB.NET>INSERT文でDBにデータを入れたい
Visual Basic(VBA)
-
15
SELECT 文 GROUP での1件目を取得
SQL Server
-
16
String"から型'Double'への変換は無効です。 とエラーが出ます。
Visual Basic(VBA)
-
17
CloseとDisposeの違い
Visual Basic(VBA)
-
18
VB2008で定数に色の設定をしたいです。(初心者)
Visual Basic(VBA)
-
19
VBの「As String * 128」とは?
Visual Basic(VBA)
-
20
VB.NETで小数点以下の桁数を取得したい
その他(ソフトウェア)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【DB】同じトランザクション内...
-
postgresql についてです
-
TPSとは・・・
-
dbFailOnError とは?
-
SQL排他問題
-
SAPのSPROって何の略ですか?
-
汎用系システムのDBについて
-
Accessdでの「トランザクション...
-
jmeterについて、教えてください。
-
復旧中のデータベースについて
-
DATファイルをEXCELで開きたい
-
SQLServer2012の復元ができない
-
エクセルのフィルタ抽出が固まる
-
マスタメンテとは?
-
ACCESSのデータをWebブラウザで...
-
PCが悪くなって新しいPCにSSMS...
-
SQL*Loaderのコミットポイント...
-
ファイルへのアクセスでエラー...
-
期限切れのバックアップの削除
-
ACCESS2003での150人同時利用
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【DB】同じトランザクション内...
-
postgresql についてです
-
TPSとは・・・
-
dbFailOnError とは?
-
一つのトランザクションでSELEC...
-
Accessdでの「トランザクション...
-
SAPのSPROって何の略ですか?
-
SQL Server 2005トランザクショ...
-
ロールバックとチェックポイン...
-
accessVBAでのワークスペース
-
SQLserver2000のレプリケーショ...
-
ADO Connection を再利用する方法
-
outlookが起動しません。
-
MySQLとPostgleSQL、ど...
-
オラクルのロールバックセグメ...
-
ロールバックとロールフォワー...
-
OracleのROWIDについて…
-
トランザクション中に別のトラ...
-
ロールフォワードとロールバッ...
-
PHP-オラクルでのトランザクション
おすすめ情報