Delphi 6下like '200703*'的SQL command給Access 2003 都無法取得正確資料 |
答題得分者是:Stallion
|
OKJeff
一般會員 發表:3 回覆:7 積分:2 註冊:2003-02-10 發送簡訊給我 |
原始碼如下
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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
謝謝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 發送簡訊給我 |
因為幾乎沒有在用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 發送簡訊給我 |
好樣的
我都沒想到要去看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 發送簡訊給我 |
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; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |