TQuery參數的問題 |
缺席
|
smallbridge
一般會員 發表:7 回覆:19 積分:5 註冊:2003-07-29 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 賦值方法(比如說254,457,787為字串形態)﹕
Query1.ParamByName('ParamValue').Value := '254,457,787';
//若為數值形態﹐如254457787﹐左右不加引號 不過您上面的SQL語法有問題喔﹐應改為如下﹐并附上完整程式碼以供參考﹕ begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('Select * From Orders Where OrderID=:ParamValue');
Query1.ParamByName('ParamValue').Value := '254,457,787';
Query1.Open;
end; 各種形態都可以設定﹐其它有關的形態及使用方法請參考以下這篇﹕
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=33023 參考看看﹗ =====================
努力,相信會獲得美麗!
忻晟 發表人 - cashxin2002 於 2003/08/21 17:28:17
------
忻晟 |
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
smallbridge
一般會員 發表:7 回覆:19 積分:5 註冊:2003-07-29 發送簡訊給我 |
|
smallbridge
一般會員 發表:7 回覆:19 積分:5 註冊:2003-07-29 發送簡訊給我 |
|
smallbridge
一般會員 發表:7 回覆:19 積分:5 註冊:2003-07-29 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
Query1.SQL.Add('Select * From Orders Where OrderID IN (254,457,787)');
或这样
Query1.SQL.Add('Select * From Orders Where OrderID IN :ParamValue');
Query1.ParamByName('ParamValue').AsString :='(254,457,787)'; 我知道您是查询OrderID是否在这个集合中! 發表人 - sos_admin 於 2003/08/21 18:06:40
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
smallbridge
一般會員 發表:7 回覆:19 積分:5 註冊:2003-07-29 發送簡訊給我 |
不好意思,樓上兩位:
我需要將參數值傳遞到SQL中,如果採用SQL:
Query1.SQL.Add('Select * From Orders Where OrderID IN :ParamValue');
Query1.ParamByName('ParamValue').AsString :='(254,457,787)';
Query1.Open;
則報SQL 關鍵字In非法。 如果採用SQL:
Query1.SQL.Add('Select * From Orders Where OrderID IN (:ParamValue)');
Query1.ParamByName('ParamValue').AsString :='254,457,787';
Query1.Open;
則報錯誤:運算式中類型不匹配。 我曾經試圖將參數ParamValue的類型改成ftArray類型,Delpgi卻報位址異常錯誤。
如果參數前不使用關鍵字In則沒有任何問題。不知是否在使用關鍵字In的情況的參數的類型以及賦值情況是不同的?
|
shinhrn
中階會員 發表:54 回覆:165 積分:83 註冊:2002-06-05 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
smallbridge
一般會員 發表:7 回覆:19 積分:5 註冊:2003-07-29 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
使用 IN 谓词
使用 IN 谓词将一个值与其他几个值进行比较。例如:
SELECT NAME
FROM STAFF
WHERE DEPT IN (20, 15)
当子查询返回一组值时,可使用 IN 和 NOT IN 运算符。 并不是所有数据库均支持的,您可以用
Query1.SQL.Add('Select * From Orders Where OrderID IN (254,457,787)');
方法测试一下是否支持!
请问您使用的是什么类型的数据库 access/sql server/db2/sybase and other
|
smallbridge
一般會員 發表:7 回覆:19 積分:5 註冊:2003-07-29 發送簡訊給我 |
直接將值寫入SQL語句,如:
Query1.SQL.Add(''Select * From Orders Where OrderID IN (254,457,787)'');
完全是沒有問題的,但是現在問題的關鍵是我不能這樣寫,需求就是必須以參數方式將值傳遞給SQL語句,所採用資料庫完全支援關鍵字In。
就是說必須以:
Query1.SQL.Add(''Select * From Orders Where OrderID IN (:ParamValues)'');
方式。 然後在其他地方獲得參數值,將參數傳遞給SQL。當然這是一條簡化的SQL,實際情況是我不知道SQL查詢語句是什麽,但是我知道參數的名稱,現在就是要將參數傳遞給TQuery,
然後獲得結果集。 標準SQL語句的其他關鍵字都可以,唯獨關鍵字In。
|
smallbridge
一般會員 發表:7 回覆:19 積分:5 註冊:2003-07-29 發送簡訊給我 |
OK,問題已經解決。多謝各位兄弟給我靈感,現將解決方法貼出來,以供參考。
解決的辦法就是在SQL未執行之前,先一步將SQL語句中的參數替換:
利用參數類型:ftArray,對此類型的參數不做任何轉換,直接替換參數。 參考代碼:
procedure TForm1.Button1Click(Sender: TObject);
Var
SQL : String;
Param : TParam;
begin
Query1.Close;
SQL := 'Select * from Orders where OrderNo in (:P)';
Query1.SQL.Text := SQL;
Query1.Params.CreateParam(ftArray,'P',ptUnknown);
Query1.ParamByName('P').DataType := ftArray;
Query1.ParamByName('P').Value :='1003,1004';
Query1.SQL.Text := ReplaceParams(Query1.SQL.Text);
Query1.Params.Clear;
Query1.Open;
end; Function TForm1.ReplaceParams(const SQL: string): String;
var
List: TParams;
I, DblQuote, Quote: Integer;
ParamValue: string;
Param: TParam;
begin
List := TParams.Create(Nil);
try
Result:= StrPas(PChar(List.ParseSQL(SQL, True)));
for I:= 0 to List.Count - 1 do
begin
Param:= Query1.ParamByName(List[I].Name);
if Param <> Nil then
begin
case Param.DataType of
ftString:
begin
ParamValue:= Param.Asstring;
DblQuote:= AnsiPos(#34, ParamValue);
Quote:= AnsiPos(#39, ParamValue);
if (Quote > 0) and (DblQuote = 0) then
ParamValue:= #34 ParamValue #34
else if (DblQuote >= 0) and (Quote = 0) then
ParamValue:= #39 ParamValue #39
else
ParamValue:= #39 ParamValue #39;
end;
ftFloat, ftCurrency, ftBCD, ftAutoInc, ftSmallInt, ftInteger, ftWord :
ParamValue:= Param.Asstring;
ftDate, ftTime, ftDateTime:
ParamValue:= FloatToStr(Param.AsFloat);
ftBoolean:
ParamValue:= BoolToStr(Param.AsBoolean,True);
ftArray: //對於 In 參數的類型
ParamValue:= Param.Asstring;
end;
Result:= StringReplace(Result, '?', ParamValue, [rfIgnoreCase]);
end;
end;
finally
List.free;
end;
end; 其實就是將TQury內部所做的參數替換工作提到前面來做。
非常感謝各位。
|
shaofu
高階會員 發表:5 回覆:136 積分:103 註冊:2003-01-07 發送簡訊給我 |
|
smallbridge
一般會員 發表:7 回覆:19 積分:5 註冊:2003-07-29 發送簡訊給我 |
|
shaofu
高階會員 發表:5 回覆:136 積分:103 註冊:2003-01-07 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |