- - PR -
Transactionを使った更新
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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) '========================================== | ||||
|
投稿日時: 2002-09-02 12:36
OleDbTransactionクラスのインポートが必要ではないか
| ||||
|
投稿日時: 2002-09-02 12:46
ここに例があるよ
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatasqlclientsqlconnectionclassbegintransactiontopic1.asp | ||||
|
投稿日時: 2002-09-02 13:28
hihiさん
すみません。実はこの例を見ながらつくったんです・・・。 文法的にまったく一緒だと思うんですが・・・。 あとOleDbTransactionクラスのインポートというのは "Dim mytrans As OleDbTransaction " のことですよね? う〜む。困った・・・。 | ||||
|
投稿日時: 2002-09-02 16:40
すみません。自己レスです。
上記のソースでうまくいきました。 エラーはデータが不正だった為でした。 あとステップインで動きを追った時に、Transactionのところを飛ばすので、 そこが悪いんだ〜と決め付けてしまっていたようです。 本当にすみません。 現在はデータセット(データテーブル)で変更したデータをdataAdapter.Updateを使って、トランザクションが使えるか試しています。 まだできてません。できそうにありません・・・。 こういう使い方ってできるんですよね? もしご存知の方がいらっしゃったらお知恵を拝借させてください。 また参考ページなど教えていただけるととてもありがたいです。 よろしくお願いします。 | ||||
|
投稿日時: 2002-09-03 12:23
どのように「できそうにありません」なのかよくわからないのですが?この文だと、DataAdapterの仕様がわからないのか、DataSetの仕様がわからないのか、どこに「できそうにない」要因があるのか、よくわかりません。 DataSetに書き込みができている時点で、エラーが発生する余地のほとんどはなくなっているのでは?DataSetをどうやって作ったかにもよりますが、オラクル(ですよね?)の表定義のほとんどを引き継いでいますよ(DataSetおよび関連するクラスの属性を見る限り)。 また、DataAdapterのUpdateCommandやInsertCommand、DeleteCommandをどのようにして作りましたか?「DataAdapterの構成」でVS.NET(?)に作らせたのなら、折りたたまれている箇所を展開して確認しておいた方がいいですよ。 | ||||
|
投稿日時: 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); ... | ||||
|
投稿日時: 2002-09-05 10:43
Jittaさん、nsfjさん、回答ありがとうございました。
Jittaさんのご指摘どおり、DataAdapterやDataSetを理解せずにプログラムをつくってしまい何が悪いかもわからずにやってました。もう少し頭を整理してから掲示板に書き込めばよかったです。すみません。 つまっていたのはasp.netのウィザードで作ったOleDbAdapterで自動生成されたUpdateCommand等をトランザクションに含めたんですが、そこでエラーがでてたのです。 なぜかといいますとnsfjさんが書かれたのをみてわかったんですが、connectionをトランザクションに設定してなかったというミスでした。 現在は正常に動いておりますので!ありがとうございました。 要はDataAdapter.update()関数はDataAdapter内のInsertCommandやUpdateCommandやDeleteCommand を実行する、それをトランザクションに含めるなら当然adapterで設定したconnectionも含めないといけないですよね。 そういうことがきちんと理解できてなかったみたいです。 (であってますよね?) それにしてもウィザードで作ったコードをちゃんとみないといけないですね〜。 自分がつくったコードと自動生成したコードが入り混じってるとなんだか気分が悪い(笑)。 やっぱり全部自分で書きたくなるのは私だけなんでしょうか・・・。 |