- PR -

BeginTransaction には接続が開かれていて使用可能なことが必要です。

1
投稿者投稿内容
みのる
大ベテラン
会議室デビュー日: 2003/07/03
投稿数: 100
投稿日時: 2003-11-07 17:39
こんにちは。。

「BeginTransaction には接続が開かれていて使用可能なことが必要です。
 Fetching です。」というエラーで悩んでます。

大まかな処理は、
「画面に入力した日付より以前の日付のTLB1・TLB2の情報を削除する。」
と言ったもので、
日付の項目を持っているテーブルはTLB1のみであり、TBL2はNOをキーに結合

コネクションは接続していると思うのですが。。。
長いですけど、ソースを載せてみました。


(省)strSQL作成 TBL1とTBL2をNOをキーにJOIN、条件:日付(TBL1の項目)

Dim cnDB As New System.Data.OleDb.OleDbConnection(clsConstant.c_strODBC)
Dim dcSelect As New OleDb.OleDbCommand(strSQL, cnDB)
Dim drSelect As OleDb.OleDbDataReader

cnDB.Open()
drSelect = dcSelect.ExecuteReader()

If drSelect.Read() Then
 Dim trnDelete As OleDb.OleDbTransaction
 Try
  trnDelete = cnDB.BeginTransaction(IsolationLevel.ReadCommitted)
  (↑ここでエラー)
  While drSelect.Read()
    NO = drSelect.Item("NO")
    (省)SQL1作成(TBL1削除 条件:NO)
    (省)SQL2作成(TBL2削除 条件:NO)
    Try
     'TBL1削除の実行
     Dim dcDelete1 As New OleDb.OleDbCommand(strSQL1, cnDB)
     dcDelete1.Transaction = trnDelete
     dcDelete1.ExecuteNonQuery()
     'TBL2削除の実行
     Dim dcDelete2 As New OleDb.OleDbCommand(strSQL2, cnDB)
     dcDelete2.Transaction = trnDelete
     dcDelete2.ExecuteNonQuery()
    Catch
     (省)エラー処理
     blnDelExe = False
     Exit While
    End Try
    drSelect.Read()
  End While
    
  If blnDelExe = True Then
   trnDelete.Commit()
  Else
   trnDelete.Rollback()
  End If
  cnDB.Close()
 Catch
  (省)
 End Try

Else
 (省)
End If
drSelect.Close()
dcSelect.Dispose()

宜しくお願いします。
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2003-11-07 18:09
一回データを読み出してる、つまりDataReaderがコネクションを
利用している、という状態で、その同じコネクションに対して
トランザクションかけようとしてるからでは?

この状態ではコネクションは使用可能ではないために
発生しているエラーかと。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2003-11-07 19:06
DataReaderがCloseされるまで
その接続にたいしてはいかなる操作も実行できません。
みのる
大ベテラン
会議室デビュー日: 2003/07/03
投稿数: 100
投稿日時: 2003-11-14 09:24
小野@EACさん、burton999さん、ありがとうございます。

結局のとこ、DataTableを使うことにしました。

SELECTでDataTableを作成し、
ぐるぐる回してDELETE。。。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-11-14 10:44
引用:

みのるさんの書き込み (2003-11-14 09:24) より:

SELECTでDataTableを作成し、
ぐるぐる回してDELETE。。。


 グルグル回す?DataAdapterを構成すれば、回すのはDataTableにチェックするときですけど?
1

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