いつもお世話になっております。
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も見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
【DB】同じトランザクション内でupdateとselectをしたときの結果値
その他(データベース)
-
複数SQL発行について
Visual Basic(VBA)
-
DataTableに入っているデータを全てinsertしたい!(C#)
Microsoft ASP
-
-
4
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
5
トランザクション中にSELECTした場合について
MySQL
-
6
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
7
コミット前の更新データをチェックするには?
Java
-
8
同一トランザクションの中でテーブルの更新結果を参照できるか?
SQL Server
-
9
ExecuteNonQueryメソッドの戻り値
その他(プログラミング・Web制作)
-
10
.NET SqlDataReader のレコード有無判定
Visual Basic(VBA)
-
11
テーブルの最後(最新)のレコードを抽出したい
MySQL
-
12
GROUP BYを使ったSELECT文の総件数を求める方法
SQL Server
-
13
CloseとDisposeの違い
Visual Basic(VBA)
-
14
DataGridViewのチェックボックスのON、OFFの判定方法
C言語・C++・C#
-
15
C#で年月を比較する
C言語・C++・C#
-
16
VB2008で定数に色の設定をしたいです。(初心者)
Visual Basic(VBA)
-
17
asp.NET初心者です。「 ’Context’は’○○○’のメンバで
Microsoft ASP
-
18
datetime型でNULL値を入れたい。
SQL Server
-
19
【VB.NET】日付型の列にNULLを登録する方法について
SQL Server
-
20
有無、要否、賛否、是非、可否、当否…これらの言葉について
その他(教育・科学・学問)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【DB】同じトランザクション内...
-
postgresql についてです
-
Accessdでの「トランザクション...
-
一つのトランザクションでSELEC...
-
TPSとは・・・
-
ADO Connection を再利用する方法
-
dbFailOnError とは?
-
汎用系システムのDBについて
-
【データベースとファイル操作...
-
jmeterについて、教えてください。
-
DBMSのロールフォワードについて
-
DATファイルをEXCELで開きたい
-
警察はスマホに保存した動画や...
-
PCが悪くなって新しいPCにSSMS...
-
accessの処理が遅い
-
復旧中のデータベースについて
-
エクセルのフィルタ抽出が固まる
-
期限切れのバックアップの削除
-
SQLServer2012の復元ができない
-
ファイルとDBの違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【DB】同じトランザクション内...
-
postgresql についてです
-
TPSとは・・・
-
Accessdでの「トランザクション...
-
一つのトランザクションでSELEC...
-
dbFailOnError とは?
-
SAPのSPROって何の略ですか?
-
SQL Server 2005トランザクショ...
-
jmeterについて、教えてください。
-
汎用系システムのDBについて
-
ADO Connection を再利用する方法
-
OracleのROWIDについて…
-
PostgreSQLのクラスタ運用について
-
ロールフォワードとロールバッ...
-
こんなのがでたんですが…
-
SQL排他問題
-
PHP-オラクルでのトランザクション
-
INSERT分の処理速度がトランザ...
-
MySQLとPostgleSQL、ど...
-
DBMSのロールフォワードについて
おすすめ情報