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

TQuery傳回總筆數的問題

答題得分者是:Fishman
kaust54
一般會員


發表:4
回覆:7
積分:2
註冊:2003-03-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-14 17:50:42 IP:61.221.xxx.xxx 未訂閱
各位大大: 小弟最近用Delphi7有一點問題想請教一下,我的資料庫是用PostgreSQL 7.4 for Linux, Client端為Windows XP,用ODBC BDE連PostgreSQL資料庫, 當我用TQuery.RecordCount這個函數時會傳回-1,但同一個資料表若用 TTable.RecordCount或(ODBC ADO)TADOQuery.RecordCount卻會傳回正確的資料筆數,實在不知道TQuery那裡出錯??請不吝指正
yachanga
資深會員


發表:24
回覆:335
積分:296
註冊:2003-09-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-14 18:55:10 IP:211.74.xxx.xxx 未訂閱
我之前也有遇到這個問題 剛剛看了一下Delphi Help, 才知道只建議使用在Paradox,dBASE... 我現在都是用其他方式來取代, 比較保險 例如 if Dataset.fieldbyName('column').asStrung<>'' then ....    Use RecordCount with care, because record counting can be a costly operation, especially for SQL queries that return large result sets. Generally, an application should only use RecordCount with Paradox and dBASE tables.    ~悠遊法國號~
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-15 08:30:53 IP:210.65.xxx.xxx 未訂閱
Hi kaust54,    前些時候遇到相同問題,測了半天得到相同結果,後來在 TQuery Open 後,先下的 TQuery.Last 後,該 TQuery.RecordCount 即正常了,不知原因為何?不過你可以試試
procedure TForm1.Button1Click(Sender: TObject);
begin
    Query1.Close;
    Query1.Open;
    Query1.Last;
    Query1.First;
    ShowMessage(IntToStr(Query1.RecordCount));
end;
---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
Wesly
中階會員


發表:14
回覆:103
積分:53
註冊:2002-05-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-15 09:50:55 IP:218.170.xxx.xxx 未訂閱
我沒有使用過您所的資料庫, 只能就我在Delphi 5 MS SQL的經驗告訴你. 在欄位的屬性若有TMomoField的欄位型態的, 在MS SQL的資料型態為text, RecordCount的值就會傳回-1, 實際原因不清礎. 在此建議您, 用Select count(*) From ????的方法去查詢資料筆數, 因為若查詢的資料集很大時, 全部將其下載至Local端, 網路將很忙碌, 不怎麼合理 希望能對你有所幫助.
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-15 11:24:16 IP:61.222.xxx.xxx 未訂閱
引言: Hi kaust54, 前些時候遇到相同問題,測了半天得到相同結果,後來在 TQuery Open 後,先下的 TQuery.Last 後,該 TQuery.RecordCount 即正常了,不知原因為何?不過你可以試試
procedure TForm1.Button1Click(Sender: TObject);
begin
    Query1.Close;
    Query1.Open;
    Query1.Last;
    Query1.First;
    ShowMessage(IntToStr(Query1.RecordCount));
end;
---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ---------------------------------- < face="Verdana, Arial, Helvetica"> 這是因為TQuery所讀的資料沒有全完回來的緣故.RDBMS有個特性,為了加快資料庫反應速度,會把先找到的資料回傳,但回傳的並不是全部的資料.例如,當你在SQL Explorer下了一個指令:"select * from tableA",假設TableA裡有資料10萬筆,那麼當你執行時,你會發現沒多久時間資料已經回來.不過這些回來的資料,並不是全部10萬筆的資料,僅是前面的若干筆資料而已,當你再把ScrollBar往下拉時,你會發現游標又出現SQL的符號,表示這時繼續再向資料庫要下一批的資料中.因此,除非你的資料全抓回來了,否則TQuery.RecordCount回傳-1是可以理解的.這也是為什麼您下了Query1.Last後就正常的原因
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-15 12:34:04 IP:210.65.xxx.xxx 未訂閱
Hi change.jian,    謝謝你的回答! 一解我心中之惑!
------
Fishman
kaust54
一般會員


發表:4
回覆:7
積分:2
註冊:2003-03-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-16 13:07:25 IP:61.221.xxx.xxx 未訂閱
太感謝各位大大
系統時間:2024-05-19 5:34:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!