@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

VB.Netのトランザクション処理でエラーが発生します。

1
投稿者投稿内容
ヤマッコ
常連さん
会議室デビュー日: 2006/06/21
投稿数: 31
投稿日時: 2006-07-25 19:25
VB.Netのトランザクション処理でエラーが発生します。
原因がつかめないのですが、下記エラー内容、ソースから
なにかわかりますでしょうか?
環境は、VS2005,SqlServer 2005,Vb.netです。

*エラー内容
System.InvalidOperationException がキャッチされました
ExecuteNonQuery は、コマンドに割り当てられた接続が保留状態であるローカルの
トランザクションにあるとき、トランザクション オブジェクトを持つコマンドが必要です。
コマンドの Transaction プロパティがまだ初期化されていません。


*ソース1
'トランザクション
CSCOM_DbHandler.MSCOM_BeginTrans()

*インサートのデータ編集

If InsertKinmuKihon(stKinmuKihon) = False Then
CSCOM_DbHandler.MSCOM_Rollback()
Return False
End If

'コミット
CSCOM_DbHandler.MSCOM_Commit()

*ソース2
Function InsertKinmuKihon() As Boolean

*SQL文生成

*インサートの実行
rowcount = CSCOM_SqlHandler.RunUpdQuery1(strSQL)
End Function

*ソース3
Function RunUpdQuery1() As Boolean
'SQL文を実行します。
Dim bgnDtm As DateTime = Now
Dim cnt As Integer = CSCOM_DbHandler.Command.ExecuteNonQuery() <<<エラーになります。
End Function
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2006-07-25 19:37
さかもとと申します。

エラーの内容そのままじゃないかと思うのですが、
>Transaction プロパティがまだ初期化されていません。
この初期化は行ってますか?


ヤマッコ
常連さん
会議室デビュー日: 2006/06/21
投稿数: 31
投稿日時: 2006-07-25 19:44
さかもとさん

返信をありがとうございます。

実は、初期化の意味がわからないんです。
もし、お手数でなければ簡単にお教えお願いできますか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-25 19:45
うーん。(;~_~)

引用:

ヤマッコさんの書き込み (2006-07-25 19:25) より:

System.InvalidOperationException がキャッチされました
ExecuteNonQuery は、コマンドに割り当てられた接続が保留状態であるローカルの
トランザクションにあるとき、トランザクション オブジェクトを持つコマンドが必要です。
コマンドの Transaction プロパティがまだ初期化されていません。


xxxCommand クラスのインスタンスにある Transaction プロパティが適切でないと考えられます。
とりあえず、Transaction 周りが例外の原因だと考えられますが、

引用:

CSCOM_DbHandler.MSCOM_BeginTrans()
(snip)
CSCOM_DbHandler.MSCOM_Rollback()
(snip)
CSCOM_DbHandler.MSCOM_Commit()


このように、「俺様クラス」 のメソッドの記述をされても、
ヤマッコさんと同じプロジェクト内のメンバでない限り、明確な判断はできないと思います。
こちらのラッパクラス (?) の、メソッドがどんな実装なのかがわからないからです。

プロジェクト部外者の勝手な想像ですが、以下のことにチャレンジしてみてください。

  1. CSCOM_DbHandler.MSCOM_BeginTrans メソッドの戻り値が Transaction であれば、
    この Transaction を CSCOM_DbHandler.Command のインスタンス内にあるであろう
    Transaction プロパティに割り当てて、ここから Commit と Rollback を実行する。
  2. CSCOM_DbHandler に Transaction なるメンバがあるのであれば、
    こちらで Commit、Rollback を実行する。
何にせよ、このラッパークラスは、良い実装ではないと思いますね。
結局、自分で面倒を見る必要があるなら、Commit、Rollback なるメソッドは不要です。

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

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