線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3524
推到 Plurk!
推到 Facebook!
[<<] [1] [2] [>>]

請教SQL.TEXT的寫法...

缺席
nachi
初階會員


發表:40
回覆:116
積分:31
註冊:2003-02-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-11 23:10:26 IP:218.165.xxx.xxx 未訂閱
procedure TForm1.Button8Click(Sender: TObject);
var t_sql:string;
begin
   if edit1.Text ='' then
   begin
      showmessage('沒有輸入搜尋條件!');
      abort;
   end
   else
   t_sql := 'SELECT CustomerNM FROM customer WHERE CustomerNM LIKE'   '%' edit1.text '%';
      query1.Close;
      query1.SQL.Text:=t_sql;
      query1.Open;
end;
當我按下搜尋鍵時會出現ERROR,文字如下: invalid:use of keyword token:LIKE line unmber:1 請問我粗字體的那部份,後面的sql語法要如何修正?! 問題是出在那部份嗎?請大大們指教...謝謝 發表人 - nachi 於 2003/03/11 23:12:39
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-11 23:34:48 IP:61.59.xxx.xxx 未訂閱
'SELECT CustomerNM FROM customer WHERE CustomerNM LIKE ''%'+edit1.text+'%'''    
nachi
初階會員


發表:40
回覆:116
積分:31
註冊:2003-02-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-12 00:08:41 IP:218.165.xxx.xxx 未訂閱
修正已後出現另一個ERROR EDatabaseERROR with message 'DBEdit1:Field'CustomerNO not found CustomerNO是我的主鍵值,但和它有什麼關係呢?
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-12 01:20:36 IP:61.59.xxx.xxx 未訂閱
引言: 'SELECT CustomerNM FROM customer WHERE CustomerNM LIKE ''%'+edit1.text+'%''' EDatabaseERROR with message 'DBEdit1:Field'CustomerNO not found
若是由上段(紅色部份)看來,你可能是打錯欄位名稱,或是漏打了 CustomerNO 不在查詢式select 語句中 請再檢查 發表人 - ddy 於 2003/03/12 01:21:32
ccchen
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-12 07:49:23 IP:61.219.xxx.xxx 未訂閱
EDatabaseERROR with message 'DBEdit1:Field'CustomerNO not found DBEdit1接向CustomerNo, 而你query1中未選此欄位
nachi
初階會員


發表:40
回覆:116
積分:31
註冊:2003-02-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-12 08:20:49 IP:218.165.xxx.xxx 未訂閱
我把程式改成如下: 'SELECT * FROM customer WHERE CustomerNM LIKE ''%' edit1.text '%''' 但執行後dbgrid和所有dbedit變成一片空白,也沒有error,按上、下、首、末筆也無效用,但可以新增,這又是怎麼一回事呢?
chih
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-12 08:28:44 IP:211.74.xxx.xxx 未訂閱
改成這樣 t_sql := ''; t_sql := 'SELECT * FROM customer WHERE CustomerNM LIKE ' #39 '%' edit1.text '%' #39; query1.Close; query1.SQL.Text:=t_sql; query1.Open; TRY TRY SEE 發表人 - chih 於 2003/03/12 08:29:35
nachi
初階會員


發表:40
回覆:116
積分:31
註冊:2003-02-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-12 08:57:28 IP:218.165.xxx.xxx 未訂閱
CHIH~ 你的方法也是沒有效果唷,出來的結果和原本是一樣滴
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-12 09:23:30 IP:211.76.xxx.xxx 未訂閱
HI, 試著將執行前的 Command 寫出來看看, 是不是 command 就有問題了. 將該 command 直接用 sql explorer 下看看結果是不是就是沒有資料, 檢 查一下吧!!
T.J.B
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-03-12 09:28:28 IP:61.220.xxx.xxx 未訂閱
你是用哪一種資料庫ㄚ 天行健 君子當自強不息~~@.@
------
天行健
君子當自強不息~~@.@
chih
版主


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-03-12 09:48:32 IP:211.74.xxx.xxx 未訂閱
我看了你原來Table的格式應該改成這樣,你原來的Table並沒有 CustomerNM 而是有CustomerNO.. procedure TForm1.Button8Click(Sender: TObject); var t_sql: string; begin //快速搜尋 if edit1.Text = '' then begin showmessage('沒有輸入搜尋條件!'); abort; end else t_sql := 'SELECT * FROM customer WHERE CustomerNO LIKE' #39 '%' edit1.text '%' #39; query1.Close; query1.SQL.Text := t_sql; query1.Open; end; TRY TRY SEE 發表人 - chih 於 2003/03/12 09:53:40
chih
版主


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-03-12 09:54:58 IP:211.74.xxx.xxx 未訂閱
建議你改成這樣,不然你其他的按鈕會有問題喔.. Text = ''> 發表人 - chih 於 2003/03/12 09:57:06
nachi
初階會員


發表:40
回覆:116
積分:31
註冊:2003-02-26

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-03-12 13:01:44 IP:218.165.xxx.xxx 未訂閱
timhuang:執行前的command?我不明白你所指何處?    T.J.B:我用PARADOX7.0    CHIH:我已經改過了,把Customer改成CustomerNM,避免欄位和檔名的名稱相同。 我把語法改成如下則結果和原來一樣,dbgrid和dbedit被清空。
procedure TForm1.Button8Click(Sender: TObject);
var t_sql: string;
begin //快速搜尋
if edit1.Text = '' then
begin
showmessage('沒有輸入搜尋條件!');
abort;
end
else
t_sql := 'SELECT * FROM customer WHERE CustomerNO LIKE'   #39   '%'   edit1.text   '%'   #39;
query1.Close;
query1.SQL.Text := t_sql;
query1.Open;
end;
若改成如下,則dbgrid和dbedit畫面都不會清空,但也沒有跳到要搜尋的資料錄。
procedure TForm1.Button8Click(Sender: TObject);
begin //快速搜尋
if edit1.Text = '' then
begin
showmessage('沒有輸入搜尋條件!');
abort;
end
else
query1.Locate('CustomerNO', Edit1.text, [loPartialKey]);
end;
要把程式上傳給你看看嗎?
chih
版主


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-03-12 13:49:29 IP:211.74.xxx.xxx 未訂閱
下面這一段是可以Run的我用你之前的TableTRY 的如果不行再把程式上傳吧..
procedure TForm1.Button8Click(Sender: TObject);
begin //快速搜尋
if edit1.Text = '' then
begin
showmessage('沒有輸入搜尋條件!');
abort;
end
else
query1.Locate('CustomerNO', Edit1.text, [loPartialKey]);
end;
發表人 - chih 於 2003/03/12 13:51:02
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-03-12 13:53:58 IP:218.16.xxx.xxx 未訂閱
1. 你按 button8 時 Edit1 的 Text 是甚麼呢? 2. 你是否肯定 Edit1.Text 內的文字是 CustomerNO 橺位內有的呢? 3. CustomerNO 欄位是否文字欄 (A) 或備註欄 (M),因若是數字欄則 like 便行不通了。 你可以試試將你的 sql 句式在 SQL Explorer 或 database desktop 內試行一下,例如若你 Edit1.Text 是 123, 就試試 SELECT * FROM customer WHERE CustomerNO LIKE "123"; 若是沒有資料,即是你的數據庫 CustomerNO 欄沒有類似 "123" 的資料,所以你的程式也沒有選出資料。
nachi
初階會員


發表:40
回覆:116
積分:31
註冊:2003-02-26

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-03-12 18:31:35 IP:218.165.xxx.xxx 未訂閱
CHIH:你寫的那一段修改後可以搜尋CustomerNO,但我把相關欄位再做修改後不能搜尋CustomerNM~底下是我修改後的程式... (edit1是CustomerNM用,edit2才是CustomerNO用)    對了,像你這種不是正規(常見)的SQL語法,是要看SQL的書嗎?因為delphi和delphi資料庫的書都是寫較正規傳統的語法....    
procedure TForm1.Button8Click(Sender: TObject);
begin //快速搜尋
   if edit1.Text = '' then
      begin
         showmessage('沒有輸入搜尋條件!');
         abort;
      end
      else
         query1.Locate('CustomerNM', Edit1.text, [loPartialKey]);
end;
Justmade: 1.TEXT內容是"文字" 2.TEXT的內容是CustomerNM有的東西,因為是看著dbgrid輸入的! 3.TEXT是文字欄(property要特別設定???)
chih
版主


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-03-12 18:53:16 IP:61.217.xxx.xxx 未訂閱
我那段語法下午就有先post過了...你可能沒有copy過去吧..Locate是資料庫搜尋的標準語法喔,看help就有了,另外你說修改後無法搜尋,我想喔..你其他的按鈕的事件沒有處理好啦...這又是另外一各問題了.. 不要一次把問題搞的越來越越複雜了... TRY TRY SEE...
引言: CHIH:你寫的那一段修改後可以搜尋CustomerNO,但我把相關欄位再做修改後不能搜尋CustomerNM~底下是我修改後的程式... (edit1是CustomerNM用,edit2才是CustomerNO用) 對了,像你這種不是正規(常見)的SQL語法,是要看SQL的書嗎?因為delphi和delphi資料庫的書都是寫較正規傳統的語法....
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-03-12 18:54:57 IP:218.16.xxx.xxx 未訂閱
引言:1.TEXT內容是"文字" 2.TEXT的內容是CustomerNM有的東西,因為是看著dbgrid輸入的!
Edit.Text 是"文字" ?? 即是你在 Edit1 內打入 "文字" ? 你 CustomerNM 裡有 "文字" 的嗎 ?
引言:3.TEXT是文字欄(property要特別設定???)
不是問 TEXT, 是問你在數據庫中 CustomerNM 是甚麼欄位 如 timhuang兄及小弟之前所言,最佳的辦法就是將你的語句在 SQL Explorer 或 Database desktop 自行測試一下,請先試試,有問題再提出罷。 另,用 locate 的方法只可找尋以 edit1.text 開頭的資料,並不能像原先 sql 那樣查中間包含 edit1.text 的資料。
nachi
初階會員


發表:40
回覆:116
積分:31
註冊:2003-02-26

發送簡訊給我
#19 引用回覆 回覆 發表時間:2003-03-12 20:49:08 IP:218.165.xxx.xxx 未訂閱
找到問題了@@ 經過再次比對,原因出在小弟的"眼誤".....目前問題已解決了 真是不好意思,下次會戴眼鏡滴@@ 讓大家忙這麼久....=.=||| 想請教另一個問題,若找不到資料,要跳message說明,該如何寫呢?
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#20 引用回覆 回覆 發表時間:2003-03-12 21:10:15 IP:218.16.xxx.xxx 未訂閱
引言: 想請教另一個問題,若找不到資料,要跳message說明,該如何寫呢?
..
..
    query1.Open;
    if query1.isEmpty then
      showmessage('沒有附合條件的資料!');
..
發表人 - Justmade 於 2003/03/12 21:13:54
chih
版主


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

發送簡訊給我
#21 引用回覆 回覆 發表時間:2003-03-12 21:20:54 IP:61.216.xxx.xxx 未訂閱
procedure TForm1.Button8Click(Sender: TObject);
begin //快速搜尋   
if edit1.Text = '' then      
begin         
showmessage('沒有輸入搜尋條件!');         
abort;      
end      
else         
if not query1.Locate('CustomerNM', Edit1.text, [loPartialKey]) then
begin
showmessage('查無資料!');         
abort;
end;
end;
nachi
初階會員


發表:40
回覆:116
積分:31
註冊:2003-02-26

發送簡訊給我
#22 引用回覆 回覆 發表時間:2003-03-12 21:51:12 IP:218.165.xxx.xxx 未訂閱
最後一個問題,我試了好久都試不出來,當搜尋完資料時,要如何讓畫面回復一開始顯示所有資料的樣子?(就是重讀) 我用query1.refresh 畫面都不會變... 而且執行query1.refresh還會error... EAccess Violation with message Access violation at address 0048E90A in module mdiapp.exe 請問我該如何解決呢?
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#23 引用回覆 回覆 發表時間:2003-03-12 21:56:57 IP:218.16.xxx.xxx 未訂閱
用回你原來的 sql 就可以了 若你以前的sql是 select * from customer,那你可用
begin
  query1.close;
  query1.sql.text := 'select * from customer';
  query1.open;
end;
這幾句亦可加在 找尋中的 if query1.isEmpty then 裡便,使找不到時不會顯示空白,而是顯示所有資料。
nachi
初階會員


發表:40
回覆:116
積分:31
註冊:2003-02-26

發送簡訊給我
#24 引用回覆 回覆 發表時間:2003-03-12 22:23:55 IP:218.165.xxx.xxx 未訂閱
procedure TForm1.Button12Click(Sender: TObject);
begin//重讀
   query1.Close;
   Query1.SQL.Add('SELECT * FROM "customer.DB" order by CustomerNO');
   query1.Open;
end;
我寫了一個重讀鈕,可是執行後卻ERROR: EAccess Violation with message Access violation at address 0048c21e in module mdiapp.exe 除了0048c21e,剩下的都一樣,我該如何修正呢?
chih
版主


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

發送簡訊給我
#25 引用回覆 回覆 發表時間:2003-03-12 22:28:51 IP:61.216.xxx.xxx 未訂閱
procedure TForm1.Button12Click(Sender: TObject); begin//重讀 query1.Close; Query1.SQL.Clear; Query1.SQL.Add('SELECT * FROM "customer.DB" order by CustomerNO'); query1.Open; end;
nachi
初階會員


發表:40
回覆:116
積分:31
註冊:2003-02-26

發送簡訊給我
#26 引用回覆 回覆 發表時間:2003-03-12 22:39:19 IP:218.165.xxx.xxx 未訂閱
CHIH:依你的寫法作了修正了,可是只能在沒有執行過搜尋功能前"重讀"才有作用,一但執行過查詢功能,再執行重讀,就會ERROR,錯誤訊息不變。
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#27 引用回覆 回覆 發表時間:2003-03-12 22:42:13 IP:218.16.xxx.xxx 未訂閱
引言:
procedure TForm1.Button12Click(Sender: TObject);
begin//重讀
   query1.Close;
   Query1.SQL.Add('SELECT * FROM "customer.DB" order by CustomerNO');
   query1.Open;
end;
你的句法的問題在於 Query.SQL.Add('...') 是將新的句法加在舊的句法以後,所以便會引起語法錯誤。你可使用我原本的 query.sql.text := '...' 或 chit君提出的先 清除 (clear) 再加上 (add) 的方法。 不過,你的程式碼的錯語訊息應是 sql 語法錯誤訴息而非 access violation... 所以你的程式可能有別的問題。
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#28 引用回覆 回覆 發表時間:2003-03-12 22:47:32 IP:218.16.xxx.xxx 未訂閱
引言: CHIH:依你的寫法作了修正了,可是只能在沒有執行過搜尋功能前"重讀"才有作用,一但執行過查詢功能,再執行重讀,就會ERROR,錯誤訊息不變。
如果是這樣,問題就應出現在別的地方了。錯誤應是出於 query1.close 時。你可否post你 Button8Click 的程式碼出來?
nachi
初階會員


發表:40
回覆:116
積分:31
註冊:2003-02-26

發送簡訊給我
#29 引用回覆 回覆 發表時間:2003-03-12 23:42:33 IP:218.165.xxx.xxx 未訂閱
Justmade:我先把程式貼上來,我去查一下CHIH所說的原因...
procedure TForm1.Button8Click(Sender: TObject);
var t_sql:string;
begin//快速搜尋客戶名稱
   if edit1.Text ='' then
   begin
      showmessage('沒有輸入搜尋條件!');
      abort;
   end
   else
      t_sql :='SELECT * FROM Customer WHERE CustomerNM LIKE ' #39 '%' Edit1.Text '%' #39 ' ORDER BY CustomerNM';
      query1.Close;
      query1.SQL.Text:=t_sql;
      query1.Open;
      if query1.isEmpty then
      begin
         showmessage('沒有符合條件的資料!');
         query1.Free;
      end;
end;
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#30 引用回覆 回覆 發表時間:2003-03-12 23:49:00 IP:211.76.xxx.xxx 未訂閱
'SELECT CustomerNM FROM customer WHERE CustomerNM LIKE' '%' edit1.text '%' 改為 'SELECT CustomerNM FROM customer WHERE CustomerNM LIKE ' '%' edit1.text '%' LIKE後加一位空格
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#31 引用回覆 回覆 發表時間:2003-03-13 00:06:55 IP:218.16.xxx.xxx 未訂閱
引言:
      if query1.isEmpty then
      begin
         showmessage('沒有符合條件的資料!');
         query1.Free;
      end;
end;
你在這裡 Free 了 Query1, 之後 Query1 便不存在了。之後你在 Button12 再呼叫己經不存在的 Query1 (如 Query1.close 等),所以 access violation 了。 你只要刪掉 query1.free 即可。
[<<] [1] [2] [>>]
系統時間:2024-06-28 17:39:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!