- PR -

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

1
投稿者投稿内容
新人
会議室デビュー日: 2006/07/21
投稿数: 12
投稿日時: 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/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-08-01 18:49
こんにちは。

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

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

ところで、この説明だとトランザクションを開始する部分が見当たりませんが、
省略されているだけでしょうか?
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-08-01 19:16
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32270&forum=7
新人
会議室デビュー日: 2006/07/21
投稿数: 12
投稿日時: 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は発行できないと思っていたのですが・・・
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-01 20:05
引用:

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

簡潔にプログラムをまとめました。
(snip)
「transaction」を記述するとエラーとなりますので、
Selectは発行できないと思っていたのですが・・・


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

  New SqlCommand(String, SqlConnection, SqlTransaction)

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

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
新人
会議室デビュー日: 2006/07/21
投稿数: 12
投稿日時: 2006-08-02 08:55
教えて頂きました、SqlCommandクラスにTransactionプロパティを追加
することにより解決いたしました。

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

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

皆様お世話になりました。ありがとうございました。
外国友人
会議室デビュー日: 2008/11/17
投稿数: 1
投稿日時: 2008-11-17 21:42
thanks a lot
1

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