- - PR -
データベースの更新について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-08-01 18:32
お世話になっております。
現在以下の環境で開発を行っております。 VS2005(ASP.NET) SQLServer2000 行いたい事 @画面のCheckBoxListを確認し、チェックされたもののみ処理を行う Aチェックされた値が存在するか、Select文で存在確認。 B存在すれば Update(2テーブル) 存在しなければ Insert(1テーブル)、もう1テーブルの存在チェックを行い、 存在すればUpdate、しなければInsert C繰り返し(@に戻る) Dエラーがなければコミット、エラーであればロールバック プログラムを記述し実行するとAの箇所で下記のエラーが発生 「ExecuteReader は、コマンドに割り当てられた接続が保留状態であるローカルの トランザクションにあるとき、トランザクション オブジェクトを持つコマンドが 必要です。コマンドの Transaction プロパティがまだ初期化されていません。 」 これは、トランザクションをCommitまたはRollbackする前に、 別のCommandを実行している為だと思います。 ただこの場合皆様ならどのように対応されているのでしょうか? DataSetでチェックされた値を取得し、その後再度ループし UpdateやInsertを行うのでしょうか? 又は、別でDBをOpenするのでしょうか? 申し訳ございませんが、皆様の意見を参考にさせて下さい。 | ||||
|
投稿日時: 2006-08-01 18:49
こんにちは。
ExecuteReader を使ったことが無いので(いつも Fill を使ってしまいます) 的外れかもしれませんが。 エラーメッセージを読んで字のごとく、トランザクション内にあるときに ExecuteReader を使用するためには、トランザクションを持つコマンドが 必要ということなのではないでしょうか。 ExecuteReader メソッドは SqlCommand オブジェクトのメソッドだと思 いますので(ですよね?)親になる SqlCommand オブジェクトの Transaction プロパティにトランザクションを設定してから ExecuteReader を実行してみるといいかもしれません。 ところで、この説明だとトランザクションを開始する部分が見当たりませんが、 省略されているだけでしょうか? _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||
|
投稿日時: 2006-08-01 19:16
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32270&forum=7
| ||||
|
投稿日時: 2006-08-01 19:20
簡潔にプログラムをまとめました。
(接続文字列省略) 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は発行できないと思っていたのですが・・・ | ||||
|
投稿日時: 2006-08-01 20:05
もちろん、SqlCommand クラスのインスタンスの生成には、下記のオーバーロードを使用していますよね? New SqlCommand(String, SqlConnection, SqlTransaction) せっかくソースを記載して頂いたのですが、SqlCommand クラスについての記述が抜けています。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-08-02 08:55
教えて頂きました、SqlCommandクラスにTransactionプロパティを追加
することにより解決いたしました。 申し訳ございませんが全く無知でした。 この機会に勉強しなおします。 皆様お世話になりました。ありがとうございました。 | ||||
|
投稿日時: 2008-11-17 21:42
thanks a lot
|
1