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

sql之in 子句之問題?

答題得分者是:P.D.
ry_lee
高階會員


發表:368
回覆:251
積分:123
註冊:2002-03-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-01 15:48:22 IP:220.131.xxx.xxx 訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-01 15:59:21 IP:61.67.xxx.xxx 未訂閱
字串型態請加入 "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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-01 23:16:52 IP:220.131.xxx.xxx 訂閱
P.D版主你好:

我試驗結果不行
P.D.
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-02 10:13:46 IP:61.67.xxx.xxx 未訂閱
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 不承認 ( ) 的部份,所以我連括號的句子也一併做進去

試試看!
編輯記錄
P.D. 重新編輯於 2007-10-02 10:16:54, 註解 無‧
P.D. 重新編輯於 2007-10-02 10:18:21, 註解 無‧
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-02 12:47:47 IP:61.222.xxx.xxx 訂閱
ACCESS 支援
qqqufo
一般會員


發表:1
回覆:17
積分:8
註冊:2007-06-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-10-04 13:28:45 IP:218.85.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-10-24 09:22:57 IP:218.163.xxx.xxx 訂閱
你好:

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, 註解 無‧
系統時間:2024-05-17 9:50:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!