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

sql語法抓不到我的值

答題得分者是:T.J.B
miga
初階會員


發表:61
回覆:92
積分:30
註冊:2002-08-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-16 14:54:21 IP:211.74.xxx.xxx 未訂閱
這段sql語法我在sql下測試過了,是沒問題的  只是拿到delphi中,要丟變數進去,sql就抓不到變數,只會幫我排序, 並不會幫我找出介於這區間的資料, 請大家幫我看看好嗎…謝謝 with DM_MT.Query_MT_choose do  begin      close;      sql.Clear;      sql.LoadFromFile('sql\Dchice.sql');          case choose_item.ItemIndex of          0:  sql.add('and STUDENT_COURSE.STU_ID >=:start_id and STUDENT_COURSE.STU_ID <=:end_id order by STUDENT_COURSE.STU_ID');          1:  sql.add('and COURSE.CRS_ID >=:start_id and COURSE.CRS_ID <=:end_id order by COURSE.CRS_ID');        end;           ParamByName('start_id').asstring:=edit1.text;   ParamByName('end_id').asstring:=edit2.text;              prepare;      open;         if recordcount=0 then         showmessage('找不到符合的資料!!');      bitbtn2Click(nil);  end;
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-12-16 15:03:25 IP:147.8.xxx.xxx 未訂閱
Don't know if it is related. I remember encountering a BUG in using BDE with Access DB back in Delphi 2.0: RecordCount will be zero when FIRST called. So I used to call it twice, e.g.
Query1.RecordCount; { it fixed a BUG???}
if Query1.RecordCount<>0 then begin
    {....}
end;
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-12-16 15:27:40 IP:211.74.xxx.xxx 未訂閱
底下改成這樣試看看.. case choose_item.ItemIndex of 0: sql.add('and STUDENT_COURSE.STU_ID BETWEEN ' #39 edit1.text #39 ' and ' #39 edit2.text #39 ' order by STUDENT_COURSE.STU_ID'); 1: sql.add('and COURSE.CRS_ID BETWEEN ' #39 edit1.text #39 ' and 'v #39 edit2.text #39 ' order by COURSE.CRS_ID'); end;
引言: case choose_item.ItemIndex of 0: sql.add('and STUDENT_COURSE.STU_ID >=:start_id and STUDENT_COURSE.STU_ID <=:end_id order by STUDENT_COURSE.STU_ID'); 1: sql.add('and COURSE.CRS_ID >=:start_id and COURSE.CRS_ID <=:end_id order by COURSE.CRS_ID'); end; ParamByName('start_id').asstring:=edit1.text; ParamByName('end_id').asstring:=edit2.text;
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-12-16 15:34:25 IP:61.221.xxx.xxx 未訂閱
miga你好: 你有試過between start_id and end_id 嗎?     
引言: case choose_item.ItemIndex of 0: sql.add('and STUDENT_COURSE.STU_ID >=:start_id and STUDENT_COURSE.STU_ID <=:end_id order by STUDENT_COURSE.STU_ID'); 1: sql.add('and COURSE.CRS_ID >=:start_id and COURSE.CRS_ID <=:end_id order by COURSE.CRS_ID'); end;
------
======================
昏睡~
不昏睡~
不由昏睡~
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-12-16 17:28:27 IP:203.217.xxx.xxx 未訂閱
除非是Local Database(如.dbf或paradox),Recordcount並不可靠,因為被選取之資料若量很大,並不會一次全進入buffer, 這是Delphi考慮效率的結果, 並不是bug. 除非你用last去到最後一筆, recordcount並不可靠 剛open之dataset可用 EOF或isEmpty檢查是否有資料, 不要用Recordcount
miga
初階會員


發表:61
回覆:92
積分:30
註冊:2002-08-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-12-16 22:57:58 IP:211.74.xxx.xxx 未訂閱
[quote] 底下改成這樣試看看.. case choose_item.ItemIndex of 0: sql.add('and STUDENT_COURSE.STU_ID BETWEEN ' #39 edit1.text #39 ' and ' #39 edit2.text #39 ' order by STUDENT_COURSE.STU_ID'); 1: sql.add('and COURSE.CRS_ID BETWEEN ' #39 edit1.text #39 ' and 'v #39 edit2.text #39 ' order by COURSE.CRS_ID'); end; 我試過了…還是不行,只會排序,而且也不會出現訊息告知說沒抓到變數 真是奇怪
miga
初階會員


發表:61
回覆:92
積分:30
註冊:2002-08-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-12-16 23:06:57 IP:211.74.xxx.xxx 未訂閱
引言: miga你好: 你有試過between start_id and end_id 嗎?
嗯…我也試了,跟上面問題一樣說…><
miga
初階會員


發表:61
回覆:92
積分:30
註冊:2002-08-27

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-12-16 23:14:23 IP:211.74.xxx.xxx 未訂閱
[quote] Don't know if it is related. I remember encountering a BUG in using BDE with Access DB back in Delphi 2.0: RecordCount will be zero when FIRST called. So I used to call it twice, e.g.
Query1.RecordCount; { it fixed a BUG???}
if Query1.RecordCount<>0 then begin
    {....}
end;
我不太懂哎,要把這段程式加在那做判斷呢 你的意思是先判斷query1裡面有沒有值嗎
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-12-16 23:16:16 IP:61.66.xxx.xxx 未訂閱
引言: 這段sql語法我在sql下測試過了,是沒問題的 只是拿到delphi中,要丟變數進去,sql就抓不到變數,只會幫我排序, 並不會幫我找出介於這區間的資料, 請大家幫我看看好嗎…謝謝 with DM_MT.Query_MT_choose do begin close; sql.Clear; sql.LoadFromFile('sql\Dchice.sql'); case choose_item.ItemIndex of 0: sql.add('and STUDENT_COURSE.STU_ID >=:start_id and STUDENT_COURSE.STU_ID <=:end_id order by STUDENT_COURSE.STU_ID'); 1: sql.add('and COURSE.CRS_ID >=:start_id and COURSE.CRS_ID <=:end_id order by COURSE.CRS_ID'); end; ParamByName('start_id').asstring:=edit1.text; ParamByName('end_id').asstring:=edit2.text; prepare; open; if recordcount=0 then showmessage('找不到符合的資料!!'); bitbtn2Click(nil); end; < face="Verdana, Arial, Helvetica"> 這應該不是參數傳不進的問題, SQL資料庫本身並不支援RECORDCOUNT用法, 以下截取DELPHI HELP說明 an application should only use RecordCount with Paradox and dBASE tables. 可以看出, RECORDCOUNT 只支援 DB, DBF格式, 如果你只是要判斷資料是否存在, 有兩個做法 1. if (DM_MT.Query_MT_choose.eof) and (DM_MT.Query_MT_choose.bof) then showmessage('記錄不存在') 2.另一種(舉例) DM_MT.Query_MT_choose.sql.text:= 'select count(*) from ..... where STUDENT_COURSE.STU_ID >=:start....'; DM_MT.Query_MT_choose.sql.execsql; DM_MT.Query_MT_choose.fieldbyname('COUNT').Asinteger=0 then showmessage('記錄不存在');
miga
初階會員


發表:61
回覆:92
積分:30
註冊:2002-08-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-12-17 00:18:12 IP:211.74.xxx.xxx 未訂閱
因為判斷有沒有資料庫中的資料是否存在 對我並不是太重要, 所以我就先把他註解掉 但是重點是… 我所輸入的區間,資料庫中確實是有資料存在的, 但是他卻出不來…    到底為何因哩…
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-12-17 00:38:58 IP:61.64.xxx.xxx 未訂閱
引言: case choose_item.ItemIndex of 0: sql.add('and STUDENT_COURSE.STU_ID BETWEEN ' #39 edit1.text #39 ' and ' #39 edit2.text #39 ' order by STUDENT_COURSE.STU_ID'); 1: sql.add('and COURSE.CRS_ID BETWEEN ' #39 edit1.text #39 ' and 'v #39 edit2.text #39 ' order by COURSE.CRS_ID'); end;
紅色部分確定沒錯嘛? 改成 case choose_item.ItemIndex of 0: sql.add('and STUDENT_COURSE.STU_ID BETWEEN :start_id and :end_id order by STUDENT_COURSE.STU_ID'); 1: sql.add('and COURSE.CRS_ID BETWEEN ':start_id and :end_id order by COURSE.CRS_ID'); ParamByName('start_id').asstring:=edit1.text; ParamByName('end_id').asstring:=edit2.text; OPEN;...以下都一樣 end;
------
======================
昏睡~
不昏睡~
不由昏睡~
miga
初階會員


發表:61
回覆:92
積分:30
註冊:2002-08-27

發送簡訊給我
#12 引用回覆 回覆 發表時間:2002-12-17 00:54:23 IP:211.74.xxx.xxx 未訂閱
引言:
引言: case choose_item.ItemIndex of 0: sql.add('and STUDENT_COURSE.STU_ID BETWEEN ' #39 edit1.text #39 ' and ' #39 edit2.text #39 ' order by STUDENT_COURSE.STU_ID'); 1: sql.add('and COURSE.CRS_ID BETWEEN ' #39 edit1.text #39 ' and 'v #39 edit2.text #39 ' order by COURSE.CRS_ID'); end;
紅色部分確定沒錯嘛? 改成 case choose_item.ItemIndex of 0: sql.add('and STUDENT_COURSE.STU_ID BETWEEN :start_id and :end_id order by STUDENT_COURSE.STU_ID'); 1: sql.add('and COURSE.CRS_ID BETWEEN ':start_id and :end_id order by COURSE.CRS_ID'); ParamByName('start_id').asstring:=edit1.text; ParamByName('end_id').asstring:=edit2.text; OPEN;...以下都一樣 end;
嗯…100%的確定哦… 第二個方法我也試過了… 結果是一樣 我想要的是只show出在區間的資料 但是全部的資料都會出來, 只有做排序而已
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#13 引用回覆 回覆 發表時間:2002-12-17 01:08:12 IP:61.66.xxx.xxx 未訂閱
引言: 因為判斷有沒有資料庫中的資料是否存在 對我並不是太重要, 所以我就先把他註解掉 但是重點是… 我所輸入的區間,資料庫中確實是有資料存在的, 但是他卻出不來… 到底為何因哩… < face="Verdana, Arial, Helvetica"> 嗯! 1.請先把 sql.text內容寫在 query中proerty的SQL內容, 成為固定寫法, 來確認你的 loadformfile的內容是否有問題, 然後檢查一下 query的property中的 parameter 是否有 start... , end..這兩個參數, 如果沒有, 則表示語法基本上有不對 另外, 我曾碰到一個狀況, 雖然不可思議, 但確實發生過 2.把 STUDENT_COURSE.STU_ID >=:start.... 改為 STUDENT_COURSE.STU_ID >= :start.... , 請在 :start.. 前加一個空白 good luck! 發表人 - P.D. 於 2002/12/17 01:11:36
miga
初階會員


發表:61
回覆:92
積分:30
註冊:2002-08-27

發送簡訊給我
#14 引用回覆 回覆 發表時間:2002-12-17 01:57:57 IP:211.74.xxx.xxx 未訂閱
嗯! 1.請先把 sql.text內容寫在 query中proerty的SQL內容, 成為固定寫法, 來確認你的 loadformfile的內容是否有問題, 然後檢查一下 query的property中的 parameter 是否有 start... , end..這兩個參數, 如果沒有, 則表示語法基本上有不對    另外, 我曾碰到一個狀況, 雖然不可思議, 但確實發生過 2.把 STUDENT_COURSE.STU_ID >=:start....  改為 STUDENT_COURSE.STU_ID >= :start.... , 請在 :start.. 前加一個空白    good luck!        發表人 - P.D. 於 2002/12/17  01:11:36 [/quote]    哇~~~~~ 我是先把 >
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#15 引用回覆 回覆 發表時間:2002-12-17 08:27:04 IP:211.74.xxx.xxx 未訂閱
我覺得問題點應該是出在sql.LoadFromFile('sql\Dchice.sql');這一段.. 我原來POST那一段是沒有問題的....可以Run... 我看你原來的寫法是>= 跟<=...這樣好像是SELECT出全部的資料喔... 如果你Dchice.sql的語法SELECT出來就是沒有資料... 那你在加條件也沒有用... 要不要把Dchice.sql POST上來讓大家幫你看ㄋ??
hagar
版主


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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2002-12-17 08:31:27 IP:202.39.xxx.xxx 未訂閱
引言: 這段sql語法我在sql下測試過了,是沒問題的 只是拿到delphi中,要丟變數進去,sql就抓不到變數,只會幫我排序, 並不會幫我找出介於這區間的資料, 請大家幫我看看好嗎…謝謝 with DM_MT.Query_MT_choose do begin close; sql.Clear; sql.LoadFromFile('sql\Dchice.sql'); case choose_item.ItemIndex of 0: sql.add('and STUDENT_COURSE.STU_ID >=:start_id and STUDENT_COURSE.STU_ID <=:end_id order by STUDENT_COURSE.STU_ID'); 1: sql.add('and COURSE.CRS_ID >=:start_id and COURSE.CRS_ID <=:end_id order by COURSE.CRS_ID'); end; ParamByName('start_id').asstring:=edit1.text; ParamByName('end_id').asstring:=edit2.text; prepare; 在這一行之前加個 ShowMessage(sql.Text); 或 Memo1.Lines.Add(sql.Text); 看看 SQL 內容結果到底為何? open; if recordcount=0 then showmessage('找不到符合的資料!!'); bitbtn2Click(nil); end; < face="Verdana, Arial, Helvetica"> -- Everything I say is a lie.
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#17 引用回覆 回覆 發表時間:2002-12-17 09:19:03 IP:147.8.xxx.xxx 未訂閱
引言: Don't know if it is related. I remember encountering a BUG in using BDE with Access DB back in Delphi 2.0: RecordCount will be zero when FIRST called. So I used to call it twice, e.g.
Query1.RecordCount; { it fixed a BUG???}
if Query1.RecordCount<>0 then begin
    {....}
end;
我不太懂哎,要把這段程式加在那做判斷呢 你的意思是先判斷query1裡面有沒有值嗎< face="Verdana, Arial, Helvetica"> As ccchen said, you cannot trust RecordCount in all cases. I find callinf RecordCount twice in an application I developed using Delphi 2 will return the correct count (strange, eh?). If possible using 'select count(*) .......' first to return the count or simply use query1.Eof right after open instead of quert1.RecordCount=0 to test if the query is empty.
miga
初階會員


發表:61
回覆:92
積分:30
註冊:2002-08-27

發送簡訊給我
#18 引用回覆 回覆 發表時間:2002-12-17 09:34:00 IP:211.74.xxx.xxx 未訂閱
引言: 我覺得問題點應該是出在sql.LoadFromFile('sql\Dchice.sql');這一段.. 我原來POST那一段是沒有問題的....可以Run... 我看你原來的寫法是>= 跟<=...這樣好像是SELECT出全部的資料喔... 如果你Dchice.sql的語法SELECT出來就是沒有資料... 那你在加條件也沒有用... 要不要把Dchice.sql POST上來讓大家幫你看ㄋ??
這是我的sql\dchice.SQL select STUDENT_COURSE.STU_ID,STUDENT_COURSE.CRS_ID,STUDENT.STU_CNAME,COURSE.CRS_NAME,COURSE.CRS_POINT,TEACHER.TEA_CNAME,DEPARTMENT.DEP_SCNAME FROM STUDENT_COURSE LEFT JOIN STUDENT ON STUDENT_COURSE.STU_ID=STUDENT.STU_ID LEFT JOIN COURSE ON STUDENT_COURSE.CRS_ID=COURSE.CRS_ID LEFT JOIN COURSE_DETAIL ON COURSE.CRS_ID=COURSE_DETAIL.CRS_ID LEFT JOIN TEACHER ON COURSE_DETAIL.TEA_ID=TEACHER.TEA_ID LEFT JOIN DEPARTMENT ON COURSE_DETAIL.DEP_ID=DEPARTMENT.DEP_ID 謝謝大家撥空幫我回答問題 另外,我有加shomessage(DM_MT.Query_MT_choose.sql.text); 出來的訊息就是dchice.sql再加上我另外加 的那些sql語法喲~~
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#19 引用回覆 回覆 發表時間:2002-12-17 09:37:52 IP:61.220.xxx.xxx 未訂閱
你sql裡頭where怎麼不見了 天行健 君子當自強不息~~@.@
------
天行健
君子當自強不息~~@.@
miga
初階會員


發表:61
回覆:92
積分:30
註冊:2002-08-27

發送簡訊給我
#20 引用回覆 回覆 發表時間:2002-12-17 09:38:00 IP:211.74.xxx.xxx 未訂閱
引言: [quote] 我覺得問題點應該是出在sql.LoadFromFile('sql\Dchice.sql');這一段.. 我原來POST那一段是沒有問題的....可以Run... 我看你原來的寫法是>= 跟<=...這樣好像是SELECT出全部的資料喔... 如果你Dchice.sql的語法SELECT出來就是沒有資料... 那你在加條件也沒有用... 要不要把Dchice.sql POST上來讓大家幫你看ㄋ??
今天我利用本機上資料庫去測這段語法, 我發現我真的沒辦法去把資料SELECT出來, 也就是說,這段語法真的有錯誤囉, 我也有改成BETWEEN 但是好像一樣 我用的是MYSQL哦 大家幫我看看我的語法吧 另外,我會用LEFT JOIN,是因為我用WHERE的話 好像多於兩個TABLE做關聯,他就會變成空集合,完全沒資料 麻煩大家了
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#21 引用回覆 回覆 發表時間:2002-12-17 09:40:11 IP:61.220.xxx.xxx 未訂閱
不過 不管你是用 leftjoin 還是rightjoin sql裡頭where關鍵字是不能拿掉的 因為where是固定要用的 天行健 君子當自強不息~~@.@ 發表人 - T.J.B 於 2002/12/17 09:42:53
------
天行健
君子當自強不息~~@.@
miga
初階會員


發表:61
回覆:92
積分:30
註冊:2002-08-27

發送簡訊給我
#22 引用回覆 回覆 發表時間:2002-12-17 10:01:10 IP:211.74.xxx.xxx 未訂閱
引言: 不過 不管你是用 leftjoin 還是rightjoin sql裡頭where關鍵字是不能拿掉的 因為where是固定要用的 天行健 君子當自強不息~~@.@ 發表人 - T.J.B 於 2002/12/17 09:42:53
啊~~ 可能之前大家以為我用WHERE,所以叫我用and就可以了, 結果我用的是left join,我也忽略了這點… 謝謝大家了,呼…弄了好幾天…竟然是錯在這…< > 不過還是謝謝大家,終於解決了…< >
系統時間:2024-06-28 7:47:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!