アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB2010でプログラム開発を行っています。
VB2010は初心者で、インターネットを使って調べながら構築していますので、ほとんど意味を理解していない状態です。
この度下記の文を書いたのですが、Point1で「Cmd.Dispose() 」を入れないとPoint2で「OleDbException が発生しました エラーを特定できません」のエラーになってしまいます。
そこで2つの疑問が出てきたので教えていただけないでしょうか。

疑問1:
なぜ、Point1でDisposeしないとエラーになってしまうのか。

疑問2:
Point1でDisposeすると、内容が破棄されると思っていたのですが、そのまま処理が進むようです。
なぜ、再度「Dim Cmd As New OleDbCommand」の宣言が必要無く、トランザクションも続いているのでしょうか。

また、よりスマートな書き方があればご教授いただけるとありがたいです。
よろしくお願いします。

Module Module1
  Public Con As New OleDbConnection
  Public Cmd As New OleDbCommand
  Public bTrans As OleDb.OleDbTransaction
  Public sb As New System.Text.StringBuilder()
End Module

Private Sub Btn_Kanryo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Kanryo.Click

  Dim ExResult AS Integer

       '新規トランザクションの開始。
       bTrans = Con.BeginTransaction
       'コマンドオブジェクトにトランザクション関連付け
       Cmd.Transaction = bTrans

       'DB更新1
       sb = New System.Text.StringBuilder
       sb.AppendLine("UPDATE A ")
       sb.AppendLine("SET")
       sb.AppendLine(" A_AA = '1'")
       sb.AppendLine(" WHERE")
       sb.AppendLine(" A_BB='123'")
       Cmd.Connection = Con
       Cmd.CommandText = sb.ToString
       ExResult = Cmd.ExecuteNonQuery()

       'ストアドプロシージャ―処理
       Cmd.Connection = Con
       Cmd.CommandType = CommandType.StoredProcedure
       Cmd.CommandText = "AAA.ABC"
       Dim outPara As New OleDbParameter("ERR_FLG", OleDbType.Decimal)
       outPara.Direction = ParameterDirection.Output
       Cmd.Parameters.Add(outPara)
       Cmd.ExecuteNonQuery()

Point1⇒ Cmd.Dispose()

       'DB更新2
       sb = New System.Text.StringBuilder
       sb.AppendLine("DELETE ")
       sb.AppendLine(" B")
       sb.AppendLine(" WHERE ")
       sb.AppendLine(" B_AA='1'")
       Cmd.Connection = Con
       Cmd.CommandText = sb.ToString
Point2⇒ ExResult = Cmd.ExecuteNonQuery()

       bTrans.Commit()

End Sub

A 回答 (1件)

推測ですが、Dispose しない場合、


Cmd.CommandType = CommandType.StoredProcedure
の状態で SQL を実行しているからではないでしょうか。
Dispose しなくても、Point2 の直前に
Cmd.CommandType = CommandType.Text
を入れるといいのではないでしょうか。
    • good
    • 0
この回答へのお礼

確かに「Cmd.CommandType = CommandType.Text」を入れたら問題なく進みました。
「Cmd.CommandType = CommandType.Text」は規定値に戻したという事になるのでしょうか?
ちなみに、私の勘違いかDisposeしてもエラーが出ておりました。。。すみません。

ありがとうございました。

お礼日時:2013/05/22 10:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!