全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2789
推到 Plurk!
推到 Facebook!

ADO存儲過程的執行如何反映在進度條上

尚未結案
danielldf
一般會員


發表:44
回覆:60
積分:20
註冊:2003-05-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-09 14:37:44 IP:218.16.xxx.xxx 未訂閱
我在ADO中执行存储过程时,发现客户端显示出当前界面死机的状态。由于存储过程很长,费时也很长(二三分鐘)。我想在存储过程执行中,在前台同时运行进度条,显示当前并没有死机而是正在运行,不知如何处理? 努力过,还有什么遗憾呢!
Roach
中階會員


發表:61
回覆:104
積分:98
註冊:2002-11-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-03 19:19:39 IP:211.20.xxx.xxx 未訂閱
每存一筆後增加 ProcessBar->Position ; Application->ProcessMessage(); 即可 But 如果死機狀態是 ADOTable->Refresh(); 造成 則無效 --------------
Roach
中階會員


發表:61
回覆:104
積分:98
註冊:2002-11-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-03 19:20:47 IP:211.20.xxx.xxx 未訂閱
忘記是 delph 把 -> 改成 . --------------
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-03 21:10:11 IP:218.163.xxx.xxx 未訂閱
小弟建議,您或可採用thread的方式來執行。 相關資訊,站上均有高手提供過,您可搜尋一下,應有所獲 http://delphi.ktop.com.tw/topic.php?topic_id=28878 ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
danielldf
一般會員


發表:44
回覆:60
積分:20
註冊:2003-05-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-04 10:59:29 IP:218.16.xxx.xxx 未訂閱
每存一筆後增加 ProcessBar->Position ; Application->ProcessMessage(); 即可 But 如果死機狀態是 ADOTable->Refresh(); 造成 則無效 -------------- 想請教一下Roach兄:"ProcessBar.Position ; Application.ProcessMessage();"加在何處呀? 我對thread還不大懂,想先找個簡單的用著。 努力过,还有什么遗憾呢!
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-04 11:50:39 IP:211.162.xxx.xxx 未訂閱
不好意思,小弟插個花: ADO來處理後臺資料有兩種方式: ①同步 ②非同步 同步的意思是說:當ADO開始處理資料後,應用程式必須等到ADO處理完畢之後才可以繼續執行。而非同步是允許ADO處理時,應用程式仍然能夠繼續執行。而當ADO處理完資料後,ADO會以事件的方式來通知應用程式,此時應用程式再根據ADO執行的結果來採取相應的動作 而像這樣的問題:應用程式需要花大量的時間的動作,我們可以在ADO中選擇以非同步的方式來執行,而讓應用程式繼續處理其他事件 ADO會以OnFetchprogress事件來通知應用程式ADO還在處理資料之中,並且以OnFetchComplete事件來通知應用程式ADO已經處理完資料了。

procedure TForm1.ADODataSet1Fetchprogress(DataSet: TCustomADODataSet;Progress,MaxProgress: Integer;var EventStatus: TEventStatus);
begin
  ProgressBar1.Position := Progress;
end;    procedure TForm1.ADODataSet1FetchComplete(DataSet: TCustomADODataSet;const Error; var EventStatus: TEventStauts);
begin
  ShowMessage('資料已經處理完了');
end;
具體實做時,還需將ADODataSet1.ExecuteOptions := [eoAsyncFetchNonBlocking],改爲非同步哦(eoAsyncFetch是同步) ================================= <>人生在勤,不索何獲 <>業精於勤荒於嬉,行成於思毀於隨 <>臨淵羡魚不如退而結網
------
人生在勤,不索何获?
danielldf
一般會員


發表:44
回覆:60
積分:20
註冊:2003-05-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-04 14:29:58 IP:218.16.xxx.xxx 未訂閱
bigdogchina兄: 如果按您的意思,非同步就是還可以同時執行操作,我就在adoprocedure執行前觸發Timer,以此顯示進度條,可是還是沒有反應,而要等到adoprocedure執行完才動作。已改爲非同步了(eoAsyncFetchNonBlocking)。 TForm1.ADODataSet1Fetchprogress這個事件是加在Tadoprocedure的事件中嗎? 我的Tadoprocedure的連接是接在ADOConnection1上的。 procedure Taccount.sp_close1FetchComplete(DataSet: TCustomADODataSet; const Error: Error; var EventStatus: TEventStatus); begin showmessage('Collect Over!'); 執行完也沒有顯示這個信息。 end; 努力过,还有什么遗憾呢!
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-04 16:15:57 IP:211.162.xxx.xxx 未訂閱
引言: bigdogchina兄: 如果按您的意思,非同步就是還可以同時執行操作,我就在adoprocedure執行前觸發Timer,以此顯示進度條,可是還是沒有反應,而要等到adoprocedure執行完才動作。已改為非同步了(eoAsyncFetchNonBlocking)。 TForm1.ADODataSet1Fetchprogress這個事件是加在Tadoprocedure的事件中嗎? 我的Tadoprocedure的連接是接在ADOConnection1上的。 procedure Taccount.sp_close1FetchComplete(DataSet: TCustomADODataSet; const Error: Error; var EventStatus: TEventStatus); begin showmessage('Collect Over!'); 執行完也沒有顯示這個資訊。 end; 努力過,還有什麽遺憾呢!
小弟試著模仿李維大師的文章,寫了一個如何利用非同步的例子,還請您仔細看看: 在執行完後將載入資料的時間寫入當前目錄下的文字檔案中! http://delphi.ktop.com.tw/topic.php?TOPIC_ID=55847 ================================= 人生在勤,不索何獲 業精於勤荒於嬉,行成於思毀於隨 臨淵羡魚不如退而結網
------
人生在勤,不索何获?
Roach
中階會員


發表:61
回覆:104
積分:98
註冊:2002-11-05

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-05 15:42:53 IP:211.20.xxx.xxx 未訂閱
各位是不是把 danielldf 兄的問題複雜化了 下面範例是把 Q1資料表的內容複製到 tTemp 資料表 這一行若拿掉則呈現死機狀態Application->ProcessMessages();
        Q1->Open();
        Q1->First();
        lblAgtPn->Caption=tAgtPn->FieldByName("AGT_PN")->AsString;
        while( !Q1->Eof ){  //
            tTemp->Append();
            tTemp->FieldByName("STATION_NAME")->AsString=Q1->FieldByName("STATION_NAME")->AsString;
            tTemp->FieldByName("LOT_NAME")->AsString=Q1->FieldByName("LOT_NAME")->AsString;
            tTemp->FieldByName("QTY")->AsInteger=Q1->FieldByName("WIP_QTY")->AsString.ToInt();
            tTemp->FieldByName("ON_HOLD")->AsBoolean=false;
            tTemp->FieldByName("REMARK")->AsString=tAgtPn->FieldByName("REMARK")->AsString;
            tTemp->Post();
            Q1->Next();
            lblStation->Caption=Q1->FieldByName("STATION")->AsString;
            ProcessBar->Position++;
            Application->ProcessMessages();
        }//while( !Q1->Eof ){
 
--------------
danielldf
一般會員


發表:44
回覆:60
積分:20
註冊:2003-05-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-09-07 18:56:34 IP:218.16.xxx.xxx 未訂閱
很是奇怪,還是不行啊! procedure TForm1.ADOProcedure1Fetchprogress(DataSet: TCustomADODataSet;Progress,MaxProgress: Integer;var EventStatus: TEventStatus); begin ProgressBar1.Position := Progress; end; 這個事件始終是沒有執行,是不是因為我那是存儲過程Adoprocedure的原因呢?Roach兄的示例我試過,但那是Adoquery;bigdogchina兄的是Adodataset,只是選擇語句的執行。小弟愚笨,請各位前輩再指教一下,多謝! 努力过,还有什么遗憾呢!
系統時間:2024-06-29 11:22:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!