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

Delphi 6下like '200703*'的SQL command給Access 2003 都無法取得正確資料

答題得分者是:Stallion
OKJeff
一般會員


發表:3
回覆:7
積分:2
註冊:2003-02-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-05-19 20:30:34 IP:220.129.xxx.xxx 訂閱
原始碼如下
Close;
With SQL do begin
Clear;
Add('select or_no, sum(amount) as total');
Add('from order_d');
Add('where or_no like ''200703*''');
Add('group by or_no');
End;
Open;
測試一....若沒加where條件,會select到資料,且筆數正確
測試二....若where or_no like ''200703*''' 改成 where or_no like ''200703270001''
不加 *,會select到資料,且筆數正確
問題就在加了*,經由Delphi到Access去查詢就是找不到資料
編輯記錄
OKJeff 重新編輯於 2007-05-20 05:45:45, 註解 無‧
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-05-19 21:03:00 IP:61.62.xxx.xxx 訂閱
OKJeff,您好
請參考 http://www.5iya.com/blog/post/16.asp
* 應該屬於其 保留字 吧,所以不能這樣用,不知你的意思是否為 只要是 200703 開頭的都要取得
如果是,改成 200703% 再試試吧 ~

我也在學習中,若有錯謬請見諒 ~
===================引 用 OKJeff 文 章===================
原始碼如下
????? Close;
????? With SQL do begin
??????? Clear;
??????? Add('select or_no, sum(amount) as total');
??????? Add('from order_d');
??????? Add('where or_no like ''200703*''');
??????? Add('group by or_no');
????? End;
????? Open;
測試一...若沒加where條件,會select到資料,且筆數正確
測試二...若where or_no like ''200703*''' 改成 where or_no like ''200703270001''
?????????????? 不加 *,會select到資料,且筆數正確
問題就在加了*,到Access去查詢就是找不到資料
------
我也在努力學習中,若有錯謬請見諒。
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-19 21:34:15 IP:211.22.xxx.xxx 未訂閱
1.萬用字元(Wildcard)在MS SQL SERVER與Access表示法不同,以比對多個字原來說SQL SERVER是以%,而ACCESS是以*來表示,而單一字元SQL SERVER是以_(底線),而ACCESS是以?(問號)來表示!
2.必須注意如果Access欄位是Memo的話是無法以條件句來查詢也無法以次欄位作為排序的。
3.觀察你的敘述句,個人判斷可能跟你的SQL構句有關,請將每個串接上來的構句前端加上一個空白看看出來的結果是否會正確!如:
Add('SELECT or_no, sum(amount) AS total');
Add(' FROM order_d');
Add(' WHERE or_no LIKE "'200703*'");
Add(' GROUP BY or_no');
===================引 用 OKJeff 文 章===================
原始碼如下
Close;
With SQL do begin
Clear;
Add('select or_no, sum(amount) as total');
Add('from order_d');
Add('where or_no like ''200703*''');
Add('group by or_no');
End;
Open;
測試一...若沒加where條件,會select到資料,且筆數正確
測試二...若where or_no like ''200703*''' 改成 where or_no like ''200703270001''
不加 *,會select到資料,且筆數正確
問題就在加了*,到Access去查詢就是找不到資料
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-05-19 21:50:45 IP:61.62.xxx.xxx 訂閱
Stallion 前輩 ~
近來常看到您的回覆,真是令人受益良多 ~
但不明白的是,為何其每行Add 時前不加 空白 似乎不影響發問者的查詢,影響的僅是有無 "*" ??

===================引 用 Stallion 文 章===================
1.萬用字元(Wildcard)在MS SQL SERVER與Access表示法不同,以比對多個字原來說SQL SERVER是以%,而ACCESS是以*來表示,而單一字元SQL SERVER是以_(底線),而ACCESS是以?(問號)來表示!
2.必須注意如果Access欄位是Memo的話是無法以條件句來查詢也無法以次欄位作為排序的。
3.觀察你的敘述句,個人判斷可能跟你的SQL構句有關,請將每個串接上來的構句前端加上一個空白看看出來的結果是否會正確!如:
?? Add('SELECT or_no, sum(amount) AS total');
?? Add(' FROM order_d');
?? Add(' WHERE or_no LIKE "'200703*'");
?? Add(' GROUP BY or_no');
------
我也在努力學習中,若有錯謬請見諒。
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-05-19 23:43:28 IP:211.22.xxx.xxx 未訂閱
adonis兄,如此誇獎真是不好意思,只是在KTOP裡作一些回饋而已~KTOP是我起步的地方,之前的版大與同好們對我真是助益良多,如果他們還能經常出現,相信你們會有更好的建議,只是有些版大與同好自從KTOP復站後還未見過他們出現,是有些遺憾!
對於這個有關SQL構句中每句串接前加入空白只是我的經驗推測,因為我也曾寫過很長的SQL串句,但是用字串相加的方法加上去的,如果句子與句子間不加空白,那麼關鍵子或欄位名等不就連在一起了!會發生錯誤。因此,我推想ADD的方法串句前應該加上空白如此而已,因為我不知道ADD方法會不會將每句前自動加入空白!至於他的萬用字元與基本SQL語法我確認在ACCESS中沒有錯。
===================引 用 adonis 文 章===================
Stallion 前輩 ~
近來常看到您的回覆,真是令人受益良多 ~
但不明白的是,為何其每行Add 時前不加 空白 似乎不影響發問者的查詢,影響的僅是有無 "*" ??

===================引 用 Stallion 文 章===================
1.萬用字元(Wildcard)在MS SQL SERVER與Access表示法不同,以比對多個字原來說SQL SERVER是以%,而ACCESS是以*來表示,而單一字元SQL SERVER是以_(底線),而ACCESS是以?(問號)來表示!
2.必須注意如果Access欄位是Memo的話是無法以條件句來查詢也無法以次欄位作為排序的。
3.觀察你的敘述句,個人判斷可能跟你的SQL構句有關,請將每個串接上來的構句前端加上一個空白看看出來的結果是否會正確!如:
?? Add('SELECT or_no, sum(amount) AS total');
?? Add(' FROM order_d');
?? Add(' WHERE or_no LIKE "'200703*'");
?? Add(' GROUP BY or_no');
OKJeff
一般會員


發表:3
回覆:7
積分:2
註冊:2003-02-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-05-20 05:35:33 IP:122.123.xxx.xxx 訂閱
謝謝adonic及Stallion
Stallion 您的顧慮我也曾想到過
先前是以SQL.Text := '....' '....' '....';
上述寫法就一定要加空白在前或後
而以Add('....')來串接
是不會被加不加空白所影響
===================引 用 Stallion 文 章===================
1.萬用字元(Wildcard)在MS SQL SERVER與Access表示法不同,以比對多個字原來說SQL SERVER是以%,而ACCESS是以*來表示,而單一字元SQL SERVER是以_(底線),而ACCESS是以?(問號)來表示!
2.必須注意如果Access欄位是Memo的話是無法以條件句來查詢也無法以次欄位作為排序的。
3.觀察你的敘述句,個人判斷可能跟你的SQL構句有關,請將每個串接上來的構句前端加上一個空白看看出來的結果是否會正確!如:
Add('SELECT or_no, sum(amount) AS total');
Add(' FROM order_d');
Add(' WHERE or_no LIKE "'200703*'");
Add(' GROUP BY or_no');
===================引 用 OKJeff 文 章===================
原始碼如下
Close;
With SQL do begin
Clear;
Add('select or_no, sum(amount) as total');
Add('from order_d');
Add('where or_no like ''200703*''');
Add('group by or_no');
End;
Open;
測試一...若沒加where條件,會select到資料,且筆數正確
測試二...若where or_no like ''200703*''' 改成 where or_no like ''200703270001''
不加 *,會select到資料,且筆數正確
問題就在加了*,到Access去查詢就是找不到資料
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-05-20 09:47:20 IP:211.22.xxx.xxx 未訂閱
因為幾乎沒有在用ACCESS了,所以在ACCESS中萬用字元的寫法,真的不熟~
不過我在微軟的Office網頁裡http://office.microsoft.com/zh-hk/access/HA011715363076.aspx發覺在ACCESS 2003中萬用字元的表示也可使用%及_,不過是要依據哪種資料庫引擎而定(詳細資料參照http://office.microsoft.com/zh-hk/access/HA011715363076.aspx)。
另外,既然你可以確定SQL的ADD方法之後有無空白並無影響,那幾可確定是萬用字元的用法必須再調整了。
var
SQLString:String;
begin
SQLString := 'SELECT or_no, SUM(amount) AS total FROM order_d WHERE or_no LIKE''' '200703*' ''' GROUP BY or_no'; //全部都是單引號,沒有雙引號,從你的範例中我不好辨認,所以改了一下,請試看看~
Close;
With SQL do
begin
Clear;
Add(SQLString);
end;
Open;
===================引 用 OKJeff 文 章===================
謝謝adonic及Stallion
Stallion 您的顧慮我也曾想到過
先前是以SQL.Text := '....' '....' '....';
上述寫法就一定要加空白在前或後
而以Add('....')來串接
是不會被加不加空白所影響
===================引 用 Stallion 文 章===================
1.萬用字元(Wildcard)在MS SQL SERVER與Access表示法不同,以比對多個字原來說SQL SERVER是以%,而ACCESS是以*來表示,而單一字元SQL SERVER是以_(底線),而ACCESS是以?(問號)來表示!
2.必須注意如果Access欄位是Memo的話是無法以條件句來查詢也無法以次欄位作為排序的。
3.觀察你的敘述句,個人判斷可能跟你的SQL構句有關,請將每個串接上來的構句前端加上一個空白看看出來的結果是否會正確!如:
Add('SELECT or_no, sum(amount) AS total');
Add(' FROM order_d');
Add(' WHERE or_no LIKE "'200703*'");
Add(' GROUP BY or_no');
===================引 用 OKJeff 文 章===================
原始碼如下
Close;
With SQL do begin
Clear;
Add('select or_no, sum(amount) as total');
Add('from order_d');
Add('where or_no like ''200703*''');
Add('group by or_no');
End;
Open;
測試一...若沒加where條件,會select到資料,且筆數正確
測試二...若where or_no like ''200703*''' 改成 where or_no like ''200703270001''
不加 *,會select到資料,且筆數正確
問題就在加了*,到Access去查詢就是找不到資料
OKJeff
一般會員


發表:3
回覆:7
積分:2
註冊:2003-02-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-05-20 20:32:26 IP:219.68.xxx.xxx 訂閱
好樣的
我都沒想到要去看online help
只看Acess附帶的help所以資料有限
因人現在在外
回家再好好的看它一番
===================引 用 Stallion 文 章===================
因為幾乎沒有在用ACCESS了,所以在ACCESS中萬用字元的寫法,真的不熟~
不過我在微軟的Office網頁裡http://office.microsoft.com/zh-hk/access/HA011715363076.aspx發覺在ACCESS 2003中萬用字元的表示也可使用%及_,不過是要依據哪種資料庫引擎而定(詳細資料參照http://office.microsoft.com/zh-hk/access/HA011715363076.aspx)。
另外,既然你可以確定SQL的ADD方法之後有無空白並無影響,那幾可確定是萬用字元的用法必須再調整了。
var
?SQLString:String;
begin
?SQLString := 'SELECT or_no, SUM(amount) AS total FROM order_d WHERE or_no LIKE''' '200703*' ''' GROUP BY or_no'; //全部都是單引號,沒有雙引號,從你的範例中我不好辨認,所以改了一下,請試看看~
?Close;
? With SQL do
?begin
? Clear;
? Add(SQLString);
?end;
?Open;
OKJeff
一般會員


發表:3
回覆:7
積分:2
註冊:2003-02-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-05-21 05:28:05 IP:122.123.xxx.xxx 訂閱
Stallion判斷方向很正確
ACCESS 2003中萬用字元的表示也可使用%及_,不過是要依據哪種資料庫引擎而定
下面的link,告訴我們要如何將Access設定符合ANSI-92的規定
http://office.microsoft.com/zh-hk/access/HP030704863076.aspx
就能避掉由Delphi送SQL到Access時,*會影響查詢的問題
===================引 用 OKJeff 文 章===================
好樣的
我都沒想到要去看online help
只看Acess附帶的help所以資料有限
因人現在在外
回家再好好的看它一番
===================引 用 Stallion 文 章===================
因為幾乎沒有在用ACCESS了,所以在ACCESS中萬用字元的寫法,真的不熟~
不過我在微軟的Office網頁裡http://office.microsoft.com/zh-hk/access/HA011715363076.aspx發覺在ACCESS 2003中萬用字元的表示也可使用%及_,不過是要依據哪種資料庫引擎而定(詳細資料參照http://office.microsoft.com/zh-hk/access/HA011715363076.aspx)。
另外,既然你可以確定SQL的ADD方法之後有無空白並無影響,那幾可確定是萬用字元的用法必須再調整了。
var
?SQLString:String;
begin
?SQLString := 'SELECT or_no, SUM(amount) AS total FROM order_d WHERE or_no LIKE''' '200703*' ''' GROUP BY or_no'; //全部都是單引號,沒有雙引號,從你的範例中我不好辨認,所以改了一下,請試看看~
?Close;
? With SQL do
?begin
? Clear;
? Add(SQLString);
?end;
?Open;
系統時間:2024-11-25 12:43:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!