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

DBExpress的SQLQuery為何不能用RecordCount??

答題得分者是:GrandRURU
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-09 09:22:27 IP:61.221.xxx.xxx 未訂閱
如題
------
ivankuo
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-10 08:58:20 IP:63.84.xxx.xxx 未訂閱
您好!    您是用DBExpress存取MySQL資料庫吧, 其實并不是DBExpress的SQLQuery不支援RecordCount的語法, 而是MySQL資料庫沒有支援這種RecordCount的語法, 請改用如下的語法做相關的判斷:
if (SQLQuery1.Bof=SQLQuery1.Eof) then
  ShowMessage('資料表沒有資料, 為空表')
else
  ShowMessage('資料表中有資料');
參考看看! ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-11 13:09:52 IP:202.39.xxx.xxx 未訂閱
怎麼個不能用法?    --- 歡迎光臨 KTop 研究院
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-11 13:22:08 IP:211.74.xxx.xxx 未訂閱
不好意思~~沒說明清楚 我的環境是win2003 D7 SQL Server 2000 我的用法是本來ADOQuery可以使用 ADOQuery.Active:=false; ADOQuery.SQL.Text:='select * from Table1'; ADOQuery.Active:=true; if ADOQuery1.RecordCount>0 then begin While not ADOQuery1.Eof do begin s:=ADOQuery1.Fieldbyname('XXX').value; ... ... ADOQuery.Next; end; 但是我想把他改成DBExpress的SQLQuery來做,在RecordCount就有問題了,complier可以過,但是到那行就會有error。 我有用ClientDataSet DataSetProvider來搭配著處理就可以了。 不過這樣比較麻煩。
------
ivankuo
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-11 13:26:37 IP:202.39.xxx.xxx 未訂閱
什麼 Error? 話說回來, 您想判斷 RecordCount > 0 的話 可以用 cashxin2002 兄那篇回答的方式 或用 IsEmpty 的方式    --- 歡迎光臨 KTop 研究院 發表人 -
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-11 17:11:02 IP:61.221.xxx.xxx 未訂閱
前輩: 經過我的測試發現,如果是一般的TABLE去SELECT是沒有問題的,但是如果是抓取pk欄位的時候,ADO沒問題,但是DBExpress會有記憶體錯誤的訊息,您可以試試看。 SQLQuery1.Active:=false; SQLQuery1.SQL.Text:='select COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME=''TABLE1'''; //有error // SQLQuery1.SQL.Text:='select * from Table1'; //這樣是ok的 SQLQuery1.Active:=true; showmessage(IntToStr(SQLQuery1.RecordCount)); ADOQuery1.Active:=false; ADOQuery1.SQL.Text:='select COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME=''TABLE1'''; ADOQuery1.Active:=true; showmessage(IntToStr(ADOQuery1.RecordCount));
------
ivankuo
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-08-18 13:11:56 IP:203.75.xxx.xxx 未訂閱
最近找到似乎是徵結點的地方,順便回覆在這篇,SQLQuery有支援RecordCount!(不然也不會出現在自動下拉的選項之中)
不過似乎是有條件的支援,詳細情形不是很清楚
個人測試過,在單一Select下(如: Select * from emp),RecordCount是可以執行的!

不過在有Join的情況下(如Select a.empid, b.deptid from emp a left join dept b......),SQLQuery執行後到RecordCount時,會出現DBX不支援該語法的問題。

以下有兩種解決的方法:
1.添加DataSetProvider、ClientDataSet,將SQLQuery的結果導到ClientDataSet,再利用ClientDataSet的RecordCount來處理
2.如果只是單純的檢查RecordCount是否為零,則可以利用SQLQuery->IsEmpty()方法來代替RecordCount,如此一來,也可以省下一筆MIDAS處理時間

以上。
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-10-20 14:15:16 IP:211.72.xxx.xxx 訂閱
從接觸 Borland 的產品開始, 便一直為 RecordCount = -1 苦惱, 不是為了知道 SELECT 進來有幾筆,
因可以用 SELECT COUNT(*) ...解決,
但因 RecNo 也 = -1, 故 DBGrid 的 Vertical ScrollBar 便永遠不知自己身在何處.
既然 Borland 已將單向 Coursor 轉為雙向, 依小弟猜測, 應該會有 Buffer 及各筆之起點指標,
故應該可以有正確的 RecordCount 與 RecNo,
例如 BCB5 之 TADOQuery 及 CrLab 公司之 TOraQuery 等便有正確的 RecordCount 與 RecNo.
因此小弟直覺的認為, 是不為也, 非不能也.
由於 RecNo 之 Property 為 ReadOnly, 無論如何繼承也無法改變,
故源頭要不肯改, 也只好繼續讓 DBGrid 的 Vertical srollBar 迷途下去了!

系統時間:2024-04-16 23:40:22
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!