VB上で、大きなmdbファイルを長いSQL文で抽出しようとしているのですが、
処理が長くて3分くらいかかってしまいます。(openメソッドから、次の一行に移るまでの時間です)
この間にアニメーションを入れて、処理が止まっていない事をアピールしたいのですが、どうやってもopenのところで処理が一度止まってしまいます。
なにか良い回避方法はないでしょうか?
VBでは普通にマルチスレッドが不可能なので、無理です。
尚、3分もかかること自体がアクセスのMDBでも尋常では
無いので、避けるべきだと思います。
因みに、その3分の間、CPU負荷は?
恐らく限りなく100%近いと思うのですが・・・
そんな状態で、アニメーションしようにも、動かないと思い
ます。
※ OSは?アクセスのバージョンは?
巨大なMDBとありますが、アクセスのバージョンによ
っては、勝手に壊れたりしますので、注意が必要です。
以上。
速やかな返信ありがとうございました。
やはり無理なのですか・・・
OSはWin98、VB6 SP5、アクセス2000を使用しています。
マシンのスペックも低い(pen2 450MHz)こともあって、
CPU使用率は確かに100%のままでした。
XP搭載マシン(pen4 2.4GHz)の方では数十秒で処理が終りました(^^;
今回どうしても低スペックマシンで動かす必要があったので、
古い環境を持ち出していたのですが、説明不足でした。申し訳ありません。
処理が遅い意外では特に問題は見られないので、このまま行こうかと思います(^^;
解決を押すのを忘れていました(TT
編集 削除解決してるなら別に良いんですが……。
ADOのレコードセットを使って開いてる場合ならOptionにadAsyncExecuteを指定すれば非同期実行できます。
実際mdbで試したことは無いんですが、SQLサーバーではこれで非同期実行できました。
DataRs.Open SQL, DataCn, adOpenStatic, adLockOptimistic, adAsyncExecute
とかして、DataRsのStateプロパティがadStateOpenになるまでループで待たせればその間にアニメーションとか出来ると思います。
Access の場合は、非同期実行は無理だと思います。
SQL Server の場合は、
DAO を使おうと RDO を使おうと ADO を使おうと
非同期実行は可能ですが...
今試してみましたが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
私も今、試してみましたが、
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 | できる できる
nanashi様、へいぽ様、ありがとうございました。
おかげさまでアニメーションの処理はうまく行きました(^^
ただ、(多分)抽出レコード数が多い場合、「不正な処理」と言われ、
VB自体が落ちてしまいます(TT
しかしながら、題名に挙げている部分は無事解決しているので、
解決ということにさせてもらいます。
これからエラーの解析に行ってきます(T▽T