- - PR -
BeginTransaction には接続が開かれていて使用可能なことが必要です。
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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() 宜しくお願いします。 | ||||
|
投稿日時: 2003-11-07 18:09
一回データを読み出してる、つまりDataReaderがコネクションを
利用している、という状態で、その同じコネクションに対して トランザクションかけようとしてるからでは? この状態ではコネクションは使用可能ではないために 発生しているエラーかと。 | ||||
|
投稿日時: 2003-11-07 19:06
DataReaderがCloseされるまで
その接続にたいしてはいかなる操作も実行できません。 | ||||
|
投稿日時: 2003-11-14 09:24
小野@EACさん、burton999さん、ありがとうございます。
結局のとこ、DataTableを使うことにしました。 SELECTでDataTableを作成し、 ぐるぐる回してDELETE。。。 | ||||
|
投稿日時: 2003-11-14 10:44
グルグル回す?DataAdapterを構成すれば、回すのはDataTableにチェックするときですけど? |
1