@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

Transactionを使った更新

投稿者投稿内容
elmo
常連さん
会議室デビュー日: 2002/08/09
投稿数: 47
投稿日時: 2002-09-02 12:03
いつもお世話になっています。elmoです。
大変困っているので、ご回答をお願いします。

現在、Commandオブジェクトを使ってSQLを発行し、データを更新するプログラムを作っています。複数のSQLを発行したいので、SQL文のどれかひとつでも失敗するとすべての更新をロールバックしたく、Transactionを使った更新にチャレンジしています。

問題点:
下記のソースの
Dim mytrans As OleDbTransaction
のところが通っていないようなのです。
(デバックのステップインを使って動きを追ってみました)
で実行のところでエラーになりロールバックされてしまいます。

なぜなのでしょうか?
transactionを使う上で設定しなければならないところがあるのでしたら、お教えください!
本当に困っています!よろしくお願いします


'==========================================
PROGRAM SORCE (LANGAGE VB)
'==========================================

Private Sub insert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles insert.Click

Dim myconnection As OleDbConnection
Dim connstr As String = "Provider=MSDAORA.1;Password=localpass;User ID=localuser;Data Source=localsource"

myconnection = New OleDbConnection(connstr)
myconnection.Open()

Dim mycommand As New OleDbCommand()
Dim mytrans As OleDbTransaction


mytrans = myconnection.BeginTransaction
mycommand.Connection = myconnection
mycommand.Transaction = mytrans

Try

'1つ目クエリー発行
mycommand.CommandText = "INSERT INTO WORKERNAME VALUES ('testcode1', 'testname1', 'testpass1', 0,0,0)"
mycommand.ExecuteNonQuery()

'2つ目クエリー発行
mycommand.CommandText = "INSERT INTO WORKERNAME VALUES ('testcode2', 'testname2', 'testpass2', 0,0,0)"
mycommand.ExecuteNonQuery()

'成功>>DB更新
mytrans.Commit()

Catch objError As Exception

'失敗>>DB更新しない
mytrans.Rollback()

Finally

'接続切断
myconnection.Close()

End Try

End Sub
'==========================================
PROGRAM SORCE (LANGAGE VB)
'==========================================
hihi
常連さん
会議室デビュー日: 2002/08/30
投稿数: 29
お住まい・勤務地: 名古屋
投稿日時: 2002-09-02 12:36
OleDbTransactionクラスのインポートが必要ではないか
hihi
常連さん
会議室デビュー日: 2002/08/30
投稿数: 29
お住まい・勤務地: 名古屋
投稿日時: 2002-09-02 12:46
ここに例があるよ
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatasqlclientsqlconnectionclassbegintransactiontopic1.asp
elmo
常連さん
会議室デビュー日: 2002/08/09
投稿数: 47
投稿日時: 2002-09-02 13:28
hihiさん
すみません。実はこの例を見ながらつくったんです・・・。
文法的にまったく一緒だと思うんですが・・・。

あとOleDbTransactionクラスのインポートというのは
"Dim mytrans As OleDbTransaction "
のことですよね?

う〜む。困った・・・。
elmo
常連さん
会議室デビュー日: 2002/08/09
投稿数: 47
投稿日時: 2002-09-02 16:40
すみません。自己レスです。

上記のソースでうまくいきました。
エラーはデータが不正だった為でした。
あとステップインで動きを追った時に、Transactionのところを飛ばすので、
そこが悪いんだ〜と決め付けてしまっていたようです。
本当にすみません。

現在はデータセット(データテーブル)で変更したデータをdataAdapter.Updateを使って、トランザクションが使えるか試しています。

まだできてません。できそうにありません・・・。
こういう使い方ってできるんですよね?
もしご存知の方がいらっしゃったらお知恵を拝借させてください。
また参考ページなど教えていただけるととてもありがたいです。
よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-09-03 12:23
引用:

elmoさんの書き込み (2002-09-02 16:40) より:
現在はデータセット(データテーブル)で変更したデータをdataAdapter.Updateを使って、トランザクションが使えるか試しています。

まだできてません。できそうにありません・・・。
こういう使い方ってできるんですよね?
もしご存知の方がいらっしゃったらお知恵を拝借させてください。
また参考ページなど教えていただけるととてもありがたいです。
よろしくお願いします。



 どのように「できそうにありません」なのかよくわからないのですが?この文だと、DataAdapterの仕様がわからないのか、DataSetの仕様がわからないのか、どこに「できそうにない」要因があるのか、よくわかりません。

 DataSetに書き込みができている時点で、エラーが発生する余地のほとんどはなくなっているのでは?DataSetをどうやって作ったかにもよりますが、オラクル(ですよね?)の表定義のほとんどを引き継いでいますよ(DataSetおよび関連するクラスの属性を見る限り)。
 また、DataAdapterのUpdateCommandやInsertCommand、DeleteCommandをどのようにして作りましたか?「DataAdapterの構成」でVS.NET(?)に作らせたのなら、折りたたまれている箇所を展開して確認しておいた方がいいですよ。
nsfj
会議室デビュー日: 2002/08/09
投稿数: 12
投稿日時: 2002-09-04 10:07
どこでうまくいかないのかわかりませんが、
DataAdapterをトランザクションが使えるようにするには
以下のようにDataAdapter内の各Commandに設定すれば良いのでは?
...
mytrans = myconnection.BeginTransaction
myadapter.InsertCommand.Connection = myconnection
myadapter.InsertCommand.Transaction = mytrans
myadapter.UpdateCommand.Connection = myconnection
myadapter.UpdateCommand.Transaction = mytrans
myadapter.DeleteCommand .Connection = myconnection
myadapter.DeleteCommand .Transaction = mytrans
Try
myadapter.Update( mydataset, mytablename);
...
elmo
常連さん
会議室デビュー日: 2002/08/09
投稿数: 47
投稿日時: 2002-09-05 10:43
Jittaさん、nsfjさん、回答ありがとうございました。

Jittaさんのご指摘どおり、DataAdapterやDataSetを理解せずにプログラムをつくってしまい何が悪いかもわからずにやってました。もう少し頭を整理してから掲示板に書き込めばよかったです。すみません。

つまっていたのはasp.netのウィザードで作ったOleDbAdapterで自動生成されたUpdateCommand等をトランザクションに含めたんですが、そこでエラーがでてたのです。
なぜかといいますとnsfjさんが書かれたのをみてわかったんですが、connectionをトランザクションに設定してなかったというミスでした。
現在は正常に動いておりますので!ありがとうございました。

要はDataAdapter.update()関数はDataAdapter内のInsertCommandやUpdateCommandやDeleteCommand を実行する、それをトランザクションに含めるなら当然adapterで設定したconnectionも含めないといけないですよね。
そういうことがきちんと理解できてなかったみたいです。
(であってますよね?)

それにしてもウィザードで作ったコードをちゃんとみないといけないですね〜。
自分がつくったコードと自動生成したコードが入り混じってるとなんだか気分が悪い(笑)。
やっぱり全部自分で書きたくなるのは私だけなんでしょうか・・・。

スキルアップ/キャリアアップ(JOB@IT)