none
ITransaction::CommitまたはITransaction::Abortが呼び出されました。オブジェクトはゾンビ状態です。というエラーが「Preserve on Commit プロパティをtrue」にしても、レコードセット件数2件以上だとコミット後に出る。 RRS feed

  • 質問

  • 2009年6月30日 にこのエラーが出るという事で、trapemiyaさんに
    「Preserve on Commit プロパティをtrue」
    という解決方法を教わりました。

    レコードセット件数が1件の時は、確かにこの方法でエラーは出なくなりました。
    しかし2件以上になると、このエラーが出ることが今日分りました。
    (trapemiyaさんに教わった時は1件の時でしか試しておらず、確認が片手落ちでした。申し訳ないです)

    1件の時と2件の時で何が違うのでしょう?
    trapemiyaさん、皆さん、同じようなエラーで申し訳ないのですが何か思い当たる節あれば
    よろしくお願い致します。

    2009年7月7日 7:08

回答

  • レコードセット単位なので1件も2件も変わらない気がするんですが、2件目というのはふたたびレコードセットを読み直しているのでしょうか? Preserve on Commit は動的プロパティなので、Refreshしたりすると失われているのかもしれません。
    また、追加情報として、ついでにPreserve on abortプロパティもtrueにしておいた方がよいと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年7月8日 1:14
  • 全体的にその画面の作りがよくわからないので的を外しているかもしれませんが、少なくとも今回のようなラベルの再表示であればRefreshは必須ではありません。
    Me.Refreshを行うと、現在表示しているレコードをデータベースから再読み込みを行います。2件以上だとうまくいかないのはRefreshの内部的な動作の影響なのかもしれません。もし、現在表示しているレコードの再読み込みが必要であれば、Refreshを使わない方法も可能だと思います。(例えばもう一度手動でレコードを読んで画面にセットし直すなどです。最近、Accessをいじっていないのでうろ覚えで申し訳ありません。)
    また、可能であればトランザクションを発行するコネクションと、画面に表示するためのコネクションを別々に用意すると良いかもしれません。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年7月8日 2:49

すべての返信

  • レコードセット単位なので1件も2件も変わらない気がするんですが、2件目というのはふたたびレコードセットを読み直しているのでしょうか? Preserve on Commit は動的プロパティなので、Refreshしたりすると失われているのかもしれません。
    また、追加情報として、ついでにPreserve on abortプロパティもtrueにしておいた方がよいと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年7月8日 1:14
  • trapemiyaさん、返信ありがとうございます。

    >レコードセット単位なので1件も2件も変わらない気がするんですが
    私もそう思えるのですが、Preserve on abortをTrueにしても、2件だと同じエラーが出ました。。

    処理に多少の時間がかかる為、ラベルに処理の経過を表示しています。
    すべての処理が終わり、コミットした後
    ラベルを「画面初期化中」と表示し、
    Me.Refresh
    をしています。ご指摘通りRefreshでエラーが出ています。

    Refreshをやめても、DoEventsでラベルは再表示されている感じなので
    とりあえずRefreshをやめる事でエラーを出さないようにします。

    何度もありがとうございました。またよろしくお願いします。
    2009年7月8日 2:06
  • 全体的にその画面の作りがよくわからないので的を外しているかもしれませんが、少なくとも今回のようなラベルの再表示であればRefreshは必須ではありません。
    Me.Refreshを行うと、現在表示しているレコードをデータベースから再読み込みを行います。2件以上だとうまくいかないのはRefreshの内部的な動作の影響なのかもしれません。もし、現在表示しているレコードの再読み込みが必要であれば、Refreshを使わない方法も可能だと思います。(例えばもう一度手動でレコードを読んで画面にセットし直すなどです。最近、Accessをいじっていないのでうろ覚えで申し訳ありません。)
    また、可能であればトランザクションを発行するコネクションと、画面に表示するためのコネクションを別々に用意すると良いかもしれません。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年7月8日 2:49
  • Refreshについては、入れる場所を精査しようと思います。
    コネクションを別々にするという発想はありませんでした。目から鱗です。
    勉強になりました。trapemiyaさん、ありがとうございました!

    2009年7月8日 4:17