データベースオープン中に別の処理を入れることは可能でしょうか?

解決


にょきにょき  2004-02-26 20:05:28  No: 82312  IP: [192.*.*.*]

VB上で、大きなmdbファイルを長いSQL文で抽出しようとしているのですが、
処理が長くて3分くらいかかってしまいます。(openメソッドから、次の一行に移るまでの時間です)

この間にアニメーションを入れて、処理が止まっていない事をアピールしたいのですが、どうやってもopenのところで処理が一度止まってしまいます。

なにか良い回避方法はないでしょうか?

編集 削除
岡田 之仁  2004-02-26 20:20:39  No: 82313  IP: [192.*.*.*]

VBでは普通にマルチスレッドが不可能なので、無理です。
尚、3分もかかること自体がアクセスのMDBでも尋常では
無いので、避けるべきだと思います。

因みに、その3分の間、CPU負荷は?
恐らく限りなく100%近いと思うのですが・・・

そんな状態で、アニメーションしようにも、動かないと思い
ます。

※  OSは?アクセスのバージョンは?
    巨大なMDBとありますが、アクセスのバージョンによ
    っては、勝手に壊れたりしますので、注意が必要です。

以上。

編集 削除
にょきにょき  2004-02-27 09:34:17  No: 82314  IP: [192.*.*.*]

速やかな返信ありがとうございました。
やはり無理なのですか・・・

OSはWin98、VB6 SP5、アクセス2000を使用しています。
マシンのスペックも低い(pen2 450MHz)こともあって、
CPU使用率は確かに100%のままでした。
XP搭載マシン(pen4 2.4GHz)の方では数十秒で処理が終りました(^^;
今回どうしても低スペックマシンで動かす必要があったので、
古い環境を持ち出していたのですが、説明不足でした。申し訳ありません。

処理が遅い意外では特に問題は見られないので、このまま行こうかと思います(^^;

編集 削除
にょきにょき  2004-02-27 09:51:29  No: 82315  IP: [192.*.*.*]

解決を押すのを忘れていました(TT

編集 削除
nanashi  2004-02-27 10:30:59  No: 82316  IP: [192.*.*.*]

解決してるなら別に良いんですが……。

ADOのレコードセットを使って開いてる場合ならOptionにadAsyncExecuteを指定すれば非同期実行できます。
実際mdbで試したことは無いんですが、SQLサーバーではこれで非同期実行できました。

DataRs.Open SQL, DataCn, adOpenStatic, adLockOptimistic, adAsyncExecute

とかして、DataRsのStateプロパティがadStateOpenになるまでループで待たせればその間にアニメーションとか出来ると思います。

編集 削除
へいぽ  2004-02-27 11:35:23  No: 82317  IP: [192.*.*.*]

Access の場合は、非同期実行は無理だと思います。

SQL Server の場合は、
DAO を使おうと RDO を使おうと ADO を使おうと
非同期実行は可能ですが...

編集 削除
nanashi  2004-02-27 12:03:16  No: 82318  IP: [192.*.*.*]

今試してみましたがAccessでも非同期実行出来ましたよ。
ADODB.Connectionで接続して、ADODB.RecordsetでOptionにadAsyncExecuteを指定して、普通に。

    With DataRs
        .Open sSQL, DataCn, adOpenStatic, adLockOptimistic, adAsyncExecute
        
        Do Until (.State = adStateOpen)
            Label1.Caption = Now
            DoEvents
        Loop
        
        Label1.Caption = "開けました"
        
        .Close
    End With

Windows2000(SP4)、VB6.0(SP5)、Access2000(SP3)、ADO2.8

編集 削除
へいぽ  2004-02-27 15:37:12  No: 82319  IP: [192.*.*.*]

私も今、試してみましたが、
ADO ならば Access でも非同期実行ができるようですね。
失礼いたしました。

非同期実行できるかどうかを確認したところ、次のような感じになるのかな。

DAO: Set daoRs = daoDb.OpenRecordset(sSQL, , dbRunAsync)
RDO: Set rdoRs = rdoCn.OpenResultset(sSQL, , , rdAsyncEnable)
ADO: adoRs.Open sSQL, adoCn, adOpenStatic, adLockOptimistic, adAsyncExecute

    |   Access      SQL Server
----+------------+-------------
DAO |  できない      できない
RDO |  できない       できる
ADO |   できる        できる

編集 削除
にょきにょき  2004-02-27 16:48:16  No: 82320  IP: [192.*.*.*]

nanashi様、へいぽ様、ありがとうございました。
おかげさまでアニメーションの処理はうまく行きました(^^

ただ、(多分)抽出レコード数が多い場合、「不正な処理」と言われ、
VB自体が落ちてしまいます(TT

しかしながら、題名に挙げている部分は無事解決しているので、
解決ということにさせてもらいます。

これからエラーの解析に行ってきます(T▽T

編集 削除