sql之in 子句之問題? |
答題得分者是:P.D.
|
ry_lee
高階會員 發表:368 回覆:251 積分:123 註冊:2002-03-19 發送簡訊給我 |
adodataset.commandtext:='select * from part where partno in (:partno)';
adodataset.parameters.parabyname('partno').value:=edit1.text; adodataset.open; 如果我只輸入一partno到edit1.text,可正確執行,但輸入多筆partno到edit1.text就不能執行,要如何才能正確執行多筆查詢,partno是 字串型態如 A001,C004,B011 我是用ADO元件去存取ACCESS資料庫. |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
字串型態請加入 "A001","C004","B011"
===================引 用 ry_lee 文 章=================== adodataset.commandtext:='select * from part where partno in (:partno)'; adodataset.parameters.parabyname('partno').value:=edit1.text; adodataset.open; 如果我只輸入一partno到edit1.text,可正確執行,但輸入多筆partno到edit1.text就不能執行,要如何才能正確執行多筆查詢,partno是 字串型態如 A001,C004,B011 我是用ADO元件去存取ACCESS資料庫. |
ry_lee
高階會員 發表:368 回覆:251 積分:123 註冊:2002-03-19 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
Access 資料庫支不支援這種語法,我沒有用過Access寫sql 並不清楚,不過對sql資料庫來說
select * from d1000 where name in ("零批","批發") 這種做法是ok的,我可以建議你做以下的測試,先測看看Access可否支援 1.利用其他資料庫管理軟體(可以開啟Access,也可以下sql的工具), 然後把你的sql語法直接下去執行看是否可用 select * from part where partno in ("A001","C004","B011") 2.通常使用 in 的方式,我會用這種方式來做,不以直接代入變數方式 msql:= 'select * from part where partno in @partsql'; .... myvar:= ' (' edit1.text ')'; // edit1.text:= "A001","C004","B011" adoquery1.sql.text:= StringReplace(msql,'@partsql',myvar,[rfReplaceAll]); 為何要如此做,因此我曾發生很多使用 in (:partno) 的方式,sql 不承認 ( ) 的部份,所以我連括號的句子也一併做進去 試試看! |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
qqqufo
一般會員 發表:1 回覆:17 積分:8 註冊:2007-06-01 發送簡訊給我 |
===================引 用 ry_lee 文 章=================== adodataset.commandtext:='select * from part where partno in (:partno)'; adodataset.parameters.parabyname('partno').value:=edit1.text; adodataset.open; 如果我只輸入一partno到edit1.text,可正確執行,但輸入多筆partno到edit1.text就不能執行,要如何才能正確執行多筆查詢,partno是 字串型態如 A001,C004,B011 我是用ADO元件去存取ACCESS資料庫. adodataset.commandtext:='select * from part where partno in (' edit1.text ')'; 这样直接编码进去试试,不要用参数。 另外,这个 adodataset 不知道有没有 debug 属性,用于在执行前 show 出其所执行的 sql 语句,如果有的话,可以把这个值设为 true , 这样就可以看到到底是什么地方出问题了。 |
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
你好:
Parameters 的使用方法不正確...試試看 const FmtSQL:string = 'select * from part where partno in (%s)'; var p:TStringList; parStr:string; i:integer; begin p := TStringList.Create; try p.CommaText := Edit1.Text; parStr := ''; for i := 0 to p.Count - 1 do parStr := parStr ':' p[i] ','; parStr := Copy(parStr, 1, Length(parStr)-1); AdoDataSet1.Close; AdoDataSet1.CommandText:= Format(FmtSQL, [parStr]); for i := 0 to AdoDataSet1.Parameters.Count - 1 do begin AdoDataSet1.Parameters[i].DataType := ftString; AdoDataSet1.Parameters[i].Value := p[i]; end; AdoDataSet1.open; finally FreeAndNil(p); end; end;
編輯記錄
Mickey 重新編輯於 2007-10-24 14:09:53, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |