DBExpress的SQLQuery為何不能用RecordCount?? |
答題得分者是:GrandRURU
|
ivankuo
中階會員 ![]() ![]() ![]() 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
cashxin2002
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好! 您是用DBExpress存取MySQL資料庫吧, 其實并不是DBExpress的SQLQuery不支援RecordCount的語法, 而是MySQL資料庫沒有支援這種RecordCount的語法, 請改用如下的語法做相關的判斷:
if (SQLQuery1.Bof=SQLQuery1.Eof) then ShowMessage('資料表沒有資料, 為空表') else ShowMessage('資料表中有資料');參考看看! ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟 |
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
ivankuo
中階會員 ![]() ![]() ![]() 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
不好意思~~沒說明清楚
我的環境是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 發送簡訊給我 |
|
ivankuo
中階會員 ![]() ![]() ![]() 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
前輩:
經過我的測試發現,如果是一般的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 發送簡訊給我 |
最近找到似乎是徵結點的地方,順便回覆在這篇,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 發送簡訊給我 |
從接觸 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 迷途下去了! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |