QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

データベースの更新について

お世話になっております。
現在以下の環境で開発を行っております。

VS2005(ASP.NET)
SQLServer2000

行いたい事
①画面のCheckBoxListを確認し、チェックされたもののみ処理を行う
②チェックされた値が存在するか、Select文で存在確認。
③存在すれば Update(2テーブル)
 存在しなければ Insert(1テーブル)、もう1テーブルの存在チェックを行い、
         存在すればUpdate、しなければInsert
④繰り返し(①に戻る)
⑤エラーがなければコミット、エラーであればロールバック

プログラムを記述し実行すると②の箇所で下記のエラーが発生
「ExecuteReader は、コマンドに割り当てられた接続が保留状態であるローカルの
トランザクションにあるとき、トランザクション オブジェクトを持つコマンドが
必要です。コマンドの Transaction プロパティがまだ初期化されていません。 」

これは、トランザクションをCommitまたはRollbackする前に、
別のCommandを実行している為だと思います。

ただこの場合皆様ならどのように対応されているのでしょうか?

DataSetでチェックされた値を取得し、その後再度ループし
UpdateやInsertを行うのでしょうか?

又は、別でDBをOpenするのでしょうか?

申し訳ございませんが、皆様の意見を参考にさせて下さい。

質問者:新人

回答

thanks a lot

投稿者:外国友人

編集 履歴 (0)

こんにちは。

ExecuteReader を使ったことが無いので(いつも Fill を使ってしまいます)
的外れかもしれませんが。

エラーメッセージを読んで字のごとく、トランザクション内にあるときに
ExecuteReader を使用するためには、トランザクションを持つコマンドが
必要ということなのではないでしょうか。
ExecuteReader メソッドは SqlCommand オブジェクトのメソッドだと思
いますので(ですよね?)親になる SqlCommand オブジェクトの
Transaction プロパティにトランザクションを設定してから
ExecuteReader を実行してみるといいかもしれません。

ところで、この説明だとトランザクションを開始する部分が見当たりませんが、
省略されているだけでしょうか?
_________________ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。

投稿者:ぽぴ王子

編集 履歴 (0)

簡潔にプログラムをまとめました。
(接続文字列省略)

Dim transaction_pre As SqlTransaction
Dim mySql As SqlCommand
Dim rst As System.Data.SqlClient.SqlDataReader

myCon.Open()
transaction = myCon.BeginTransaction

For i = 0 To ChkBox.Items.Count - 1
If ChkBox.Items(i).Selected Then

★Select文発行
・存在すれば、Update
・なければ、Insert
End If

Next i

Try
Try
mySql.ExecuteNonQuery()
Catch sqle As SqlException
transaction.Rollback()
myCon.Close()
End Try
transaction.Commit()
Finally
myCon.Close()
End Try

★Select文の中身

sSql = ""
sSql = sSql & "SELECT" & vbCr ●省略

mySql = New SqlCommand(sSql, myCon)
rst = mySql.ExecuteReader() →エラー発生

「transaction」を記述するとエラーとなりますので、
Selectは発行できないと思っていたのですが・・・

投稿者:新人

編集 履歴 (0)

新人さんの書き込み (2006-08-01 19:20) より:

簡潔にプログラムをまとめました。

(snip)

「transaction」を記述するとエラーとなりますので、

Selectは発行できないと思っていたのですが・・・

もちろん、SqlCommand クラスのインスタンスの生成には、下記のオーバーロードを使用していますよね?

  New SqlCommand(String, SqlConnection, SqlTransaction)

せっかくソースを記載して頂いたのですが、SqlCommand クラスについての記述が抜けています。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

教えて頂きました、SqlCommandクラスにTransactionプロパティを追加
することにより解決いたしました。

申し訳ございませんが全く無知でした。

この機会に勉強しなおします。

皆様お世話になりました。ありがとうございました。

投稿者:新人

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。