線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1650
推到 Plurk!
推到 Facebook!

Query & ADOQuery之效能比較

尚未結案
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-07 01:57:05 IP:61.59.xxx.xxx 未訂閱
請問DataBase & Query需先有BDE or ODBC, ADOConnection & ADOQuery是否通常為指定資料庫位置 其效能是否有何者較佳? 因我的資料庫位置可依使用者需要而改變與有一資料庫為FoxPro,所以用ODBC 來做,不過感覺效能不彰,是否與ODBC有關 印象中據Microsoft的說法,ADO比ODBC好,但因上數之需求(資料庫位置可依使用者需要而改變與有一資料庫為FoxPro),是否可以改用ADOConnection且其資料庫來源位置仍是ODBC之資料
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-07 07:10:50 IP:192.168.xxx.xxx 未訂閱
引言: 請問DataBase & Query需先有BDE or ODBC, ADOConnection & ADOQuery是否通常為指定資料庫位置 其效能是否有何者較佳? 因我的資料庫位置可依使用者需要而改變與有一資料庫為FoxPro,所以用ODBC 來做,不過感覺效能不彰,是否與ODBC有關 印象中據Microsoft的說法,ADO比ODBC好,但因上數之需求(資料庫位置可依使用者需要而改變與有一資料庫為FoxPro),是否可以改用ADOConnection且其資料庫來源位置仍是ODBC之資料
1.無論是BDE或是ADO都可以動態指定您Foxpro DBF檔的所在位置啊! 2..DBF或.DB的資料檔案,最好用Native方式效率會比較好, 而且盡量不要用TQuery,盡量用TTable Index的方式,速度差粉多喔! ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-07 10:19:19 IP:61.59.xxx.xxx 未訂閱
我的語法大致如下 A-1(FoxPro)--匯入-->A-2(Access) B-1(FoxPro)--匯入-->B-2(Access) PS 分別使用Database & Query by ODBC 資料量如果一大,在同一資料下有時沒問題,有時執行到某一程度(通常超過50%到80%)就停住了,原本想是否這些資料有問題,但發生問題之資料筆卻又不一定,也試過將疑似有問題之記錄刪除亦無效,是否是因為使用Query支緣故? 還是我的語法造成的結果?    
procedure TFMTransPOS.FormCreate(Sender: TObject);
BEGIN
         TabSheet1.Show;
        //********資料A-1(FoxPro)********
        TransData.LYTsstockQUERY.SQL.Clear;
        TransData.LYTsstockQUERY.SQL.Add('Select * From sstock ');
        TransData.LYTsstockQUERY.SQL.Add('Order by sk_no');
        TransData.LYTsstockQUERY.CLOSE;
        TransData.LYTsstockQUERY.OPEN;            TransData.tcomQUERY.SQL.Clear;
        TransData.tcomQUERY.SQL.Add('SELECT Count(*) FROM sstock ');
        TransData.tcomQUERY.CLOSE;
        TransData.tcomQUERY.OPEN;
        Panel_P1.Caption := '資料筆數:共 ' IntToStr(TransData.tcomQuery.Fields[0].AsInteger) ' 筆';            //********資料A-2(Access)********
        DBGrid2.DataSource := TransData.BprdDataSource;                 TransData.BprdQUERY.SQL.Clear;
        TransData.BprdQUERY.SQL.Add('SELECT * FROM BPRD ');
        TransData.BprdQUERY.SQL.Add('Order by sk_no ');
        TransData.BprdQUERY.CLOSE;
        TransData.BprdQUERY.OPEN;            TransData.QUERYS.SQL.Clear;
        TransData.QUERYS.SQL.Add('SELECT Count(*) FROM Bprd ');
        TransData.QUERYS.CLOSE;
        TransData.QUERYS.OPEN;
        Panel_P2.Caption := '資料筆數:共 ' IntToStr(TransData.QueryS.Fields[0].AsInteger) ' 筆';            //********資料B-1(FoxPro)********
        DBGrid3.DataSource := TransData.LYTpcustDataSource;   //FoxPro            TransData.LYTpcustQUERY.SQL.Clear;
        TransData.LYTpcustQUERY.SQL.Add('Select * From pcust ');
        TransData.LYTpcustQUERY.SQL.Add('where ct_class=''1'' ');
        TransData.LYTpcustQUERY.SQL.Add('Order by ct_no');
        TransData.LYTpcustQUERY.CLOSE;
        TransData.LYTpcustQUERY.OPEN;            TransData.cenoQUERY.SQL.Clear;
        TransData.cenoQUERY.SQL.Add('SELECT Count(*) FROM pcust ');
        TransData.cenoQUERY.SQL.Add('where ct_class=''1'' ');
        TransData.cenoQUERY.CLOSE;
        TransData.cenoQUERY.OPEN;
        Panel_C1.Caption := '資料筆數:共 ' IntToStr(TransData.cenoQuery.Fields[0].AsInteger) ' 筆';            //********資料B-2(前台Access)********
        DBGrid4.DataSource := TransData.BcustDataSource;     //後台Access            TransData.BcustQUERY.SQL.Clear;
        TransData.BcustQUERY.SQL.Add('SELECT * FROM Bcust ');
        TransData.BcustQUERY.SQL.Add('Order by ct_no ');
        TransData.BcustQUERY.CLOSE;
        TransData.BcustQUERY.OPEN;            TransData.QUERYS.SQL.Clear;
        TransData.QUERYS.SQL.Add('SELECT Count(*) FROM Bcust ');
        TransData.QUERYS.CLOSE;
        TransData.QUERYS.OPEN;
        Panel_C2.Caption := '資料筆數:共 ' IntToStr(TransData.QueryS.Fields[0].AsInteger) ' 筆';
End;    procedure TFMTransPOS.TransAllDATClick(Sender: TObject);
var
    L_SKENO,.........以下略過        i: Integer;
    GFORM : TFORM;      //(進度表)需在users有 FORMS, Gauges
    GGAUGE : TGAUGE;    //(進度表)需在users有 FORMS, Gauges
    GLabel : TLabel;
begin
         Try
         TransData.LYTsstockQuery.First;                     //FoxPro
         While not TransData.LYTsstockQuery.Eof do           //FoxPro
         Begin
         //======FoxPro======
         L_SKENO := Trim(TransData.LYTsstockQUERY.FieldByName('sk_no').AsString);      
         .....略.....             //開啟第二連結檔
         TransData.LYTsstkdtQUERY.SQL.Clear;
         TransData.LYTsstkdtQUERY.SQL.Add('SELECT * FROM SSTKDT ');
         TransData.LYTsstkdtQUERY.SQL.Add('WHERE sk_no = ''' L_SKENO ''' ');
         TransData.LYTsstkdtQUERY.SQL.Add('order by sk_no ');  
         TransData.LYTsstkdtQUERY.CLOSE;
         TransData.LYTsstkdtQUERY.OPEN;
         L_SKSUP := TransData.LYTsstkdtQUERY.FieldByName('s_supp').AsString; 
         .....略.....                    //開啟第三連結檔
         .....略.....                    //開啟資料庫(Access)
         TransData.BprdQUERY.SQL.Clear;
         TransData.BprdQUERY.SQL.Add('SELECT * FROM BPRD ');
         TransData.BprdQUERY.SQL.Add('WHERE sk_no = ''' L_SKENO ''' ');
         TransData.BprdQUERY.SQL.Add('Order by sk_no ');
         TransData.BprdQUERY.CLOSE;
         TransData.BprdQUERY.OPEN;             If TransData.BprdQuery.Eof = False then //----------------------------------------
         Begin
             Update_to_Bprd_ALL(L_SKENO,         .....略.....       );
         End Else Begin   //if BprdQuery.Eof
         Insert_to_Bprd(L_SKENO,         .....略.....       );
         END;  //else (BprdQuery.Eof)-------------------------------------------------------             TransData.LYTsstockQuery.Next;   //While not ** do    //FoxPro
         END;  //While
         
         TransData.BprdQUERY.SQL.Clear;
         TransData.BprdQUERY.SQL.Add('SELECT * FROM BPRD ');
         TransData.BprdQUERY.SQL.Add('Order by sk_no ');
         TransData.BprdQuery.Close;
         TransData.BprdQuery.Open;             Finally
         TransData.QUERYS.SQL.Clear;
         TransData.QUERYS.SQL.Add('SELECT Count(*) FROM Bprd ');
         TransData.QUERYS.CLOSE;
         TransData.QUERYS.OPEN;             end; //end try
end;    //--------------------------------------------------------------------------
procedure TFMTransPOS.TransAllCustClick(Sender: TObject);
var
    L_ctno,L_ctname,         .....略.....
Begin
         Try
         TransData.LYTpcustQuery.First;                     //FoxPro
         While not TransData.LYTpcustQuery.Eof do           //FoxPro
         Begin
         //======FoxPro======
         L_ctno := Trim(TransData.LYTpcustQUERY.FieldByName('ct_no').AsString);              
         .....略.....             //開啟第二連結檔
         .....略.....             //開啟資料庫(Access)
         TransData.BcustQUERY.SQL.Clear;
         TransData.BcustQUERY.SQL.Add('SELECT * FROM Bcust ');
         TransData.BcustQUERY.SQL.Add('WHERE ct_no = ''' L_ctno ''' ');
         TransData.BcustQUERY.SQL.Add('Order by ct_no ');
         TransData.BcustQUERY.CLOSE;
         TransData.BcustQUERY.OPEN;             If TransData.BcustQuery.Eof = False then
         Begin
            Update_to_BMEM(L_ctno,         .....略.....);
         End else begin   //If
            Insert_to_BMEM(L_ctno,         .....略.....);
         END;  //else             TransData.LYTpcustQuery.Next;   //While not ** do    //FoxPro
         END;  //While             TransData.BcustQUERY.SQL.Clear;
         TransData.BcustQUERY.SQL.Add('SELECT * FROM Bcust ');
         TransData.BcustQUERY.SQL.Add('Order by ct_no ');
         TransData.BcustQuery.Close;
         TransData.BcustQuery.Open;             Finally
         TransData.QUERYS.SQL.Clear;
         TransData.QUERYS.SQL.Add('SELECT Count(*) FROM Bcust ');
         TransData.QUERYS.CLOSE;
         TransData.QUERYS.OPEN;
         end; //end try
end;    //-----------------------------------------------------------------------------------
/Inset 新增資料之副程式
Procedure TFMTransPOS.Insert_to_BMEM(L_ctno,         .....略.....);
var SQL : String;
Begin
         TransData.QueryP.SQL.Clear;
         SQL := 'INSERT INTO BCUST ';
         SQL := SQL   '( ct_no ,         .....略..... )';
         SQL := SQL   ' Values ';
         SQL := SQL   '( :ct_no ,:ct_name ,         .....略..... )';
         TransData.QueryP.SQL.Text := SQL;             TransData.QueryP.ParamByName('ct_no').AsString        := L_ctno;
                  .....略.....             try TransData.QueryP.ExecSQL; except ShowMessage('轉入失敗!'); end;    END;    //Update 更新資料之副程式
Procedure TFMTransPOS.Update_to_BMEM(L_ctno,         .....略.....);
var SQL : String;
Begin
         TransData.QueryP.SQL.Clear;
         SQL := 'Update BCUST SET ';
         SQL := SQL   ' ct_name    =:ct_name    ,         .....略.....  ';
         SQL := SQL   'Where ct_no = ''' L_ctno ''' ';
         TransData.QueryP.SQL.Text := SQL;             TransData.QueryP.ParamByName('ct_name').AsString      := L_ctname;
         .....略.....             try TransData.QueryP.ExecSQL; except ShowMessage('轉入失敗!'); end;
END;
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-07 22:29:39 IP:192.168.xxx.xxx 未訂閱
引言: 資料量如果一大,在同一資料下有時沒問題,有時執行到某一程度(通常超過50%到80%)就停住了
有用Debug去查看停住了是停在哪一行嗎? ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-08 14:11:34 IP:61.59.xxx.xxx 未訂閱
請問 在ADOQuery的Provider並沒有FoxPro項目,如果用Provider for ODBC Driver再去選擇BDE or ODBC之資料來源,雖然可以,不過不知是否會有問題?與效益?
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-08 17:27:33 IP:192.168.xxx.xxx 未訂閱
引言: 請問 在ADOQuery的Provider並沒有FoxPro項目,如果用Provider for ODBC Driver再去選擇BDE or ODBC之資料來源,雖然可以,不過不知是否會有問題?與效益?
還是建議不要用ADOQuery或TQuery去讀.DBF檔 最好用TTable或ADOTable去讀.DBF檔效能會較好 ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
Paicaso
中階會員


發表:140
回覆:124
積分:52
註冊:2002-09-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-09 01:09:59 IP:61.59.xxx.xxx 未訂閱
那如排除DBF等因素? 因在我另一問題 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=29985 改用ADO便OK了
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-09 08:41:24 IP:192.168.xxx.xxx 未訂閱
引言: 那如排除DBF等因素? 因在我另一問題 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=29985 改用ADO便OK了
採用BDE Native連接Blob的欄位會有64K的限制, 採用ADO則無此限制! ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
系統時間:2024-07-03 17:20:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!