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

TQuery參數的問題

缺席
smallbridge
一般會員


發表:7
回覆:19
積分:5
註冊:2003-07-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-21 16:55:26 IP:218.1.xxx.xxx 未訂閱
請問如何對SQL:Select * From Orders Where OrderID In (:ParamValue) 中的ParamsValue賦值?假設ParamsValue = 254,457,787 ParamValue的類型到底應該是什麽類型的?
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-21 17:20:08 IP:63.84.xxx.xxx 未訂閱
您好﹗    賦值方法(比如說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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-21 17:24:20 IP:61.155.xxx.xxx 未訂閱
254,457,787 请问您这个到底是什么类型? 我向应该是字符串行的,所以如下: //字符串 Query1.ParamByName('ParamValue').AsString :='254,457,787'; 如果为整形就用这个 //整形数值 Query1.ParamByName('ParamValue').AsInteger :=254457787;
smallbridge
一般會員


發表:7
回覆:19
積分:5
註冊:2003-07-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-21 17:56:36 IP:218.1.xxx.xxx 未訂閱
不行報:類型匹配錯誤!是不是因爲使用的是SQL關鍵字 IN的原因。 無論將參數類型定位整數還是字串都是錯誤。 如果參數只有一個值 如:In (:ParamValue) ParamValue爲245 將參數類型設置成整數到是對的。一旦是多個值無論如何都不行? 是不是需要將參數類型設置常ftArray類型的?但設置後如何給ftArray類型賦值?按照AsString賦值的話,Delphi報了一個位址異常錯誤。
smallbridge
一般會員


發表:7
回覆:19
積分:5
註冊:2003-07-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-21 18:00:56 IP:218.1.xxx.xxx 未訂閱
我的SQL語句不是 Query1.SQL.Add('Select * From Orders Where OrderID=:ParamValue'); 而是 Query1.SQL.Add('Select * From Orders Where OrderID  IN :ParamValue');
smallbridge
一般會員


發表:7
回覆:19
積分:5
註冊:2003-07-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-21 18:01:20 IP:218.1.xxx.xxx 未訂閱
我的SQL語句不是 Query1.SQL.Add('Select * From Orders Where OrderID=:ParamValue'); 而是 Query1.SQL.Add('Select * From Orders Where OrderID  IN (:ParamValue)');
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-21 18:04:28 IP:61.155.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-08-21 18:09:23 IP:63.84.xxx.xxx 未訂閱
您好﹗    原來您寫的254,457,787是代表三個數值喔﹐歹勢﹗看錯了﹗ 那就不需要使用>> ><>===================== 努力,相信會獲得美麗! 忻晟 發表人 -
------
忻晟
smallbridge
一般會員


發表:7
回覆:19
積分:5
註冊:2003-07-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-08-22 09:44:04 IP:218.1.xxx.xxx 未訂閱
不好意思,樓上兩位: 我需要將參數值傳遞到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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-08-22 10:03:15 IP:61.65.xxx.xxx 未訂閱
這樣不行嗎? ParamValue :='254,457,787'; Query1.SQL.Add('Select * From Orders Where OrderID IN (' + ParamValue + ')');
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-08-22 10:10:41 IP:61.155.xxx.xxx 未訂閱
Query1.SQL.Add('Select * From Orders Where OrderID IN (254,457,787)'); 如果您这样用,in还非法;那么您所使用的资料库一定不支持in的查询语法! 您使用什么样的数据库呀?
smallbridge
一般會員


發表:7
回覆:19
積分:5
註冊:2003-07-29

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-08-22 10:13:51 IP:218.1.xxx.xxx 未訂閱
我必須傳遞參數進入SQL,因爲是動態SQL語句,其他SQL關鍵字如:Like, >, >=等都沒有問題,爲何關鍵字In不行?關鍵字In到底該如何傳遞參數? 按樓上老兄說的,我豈不是要分析SQL語句了? 哪位大哥救救兄弟啊?
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-08-22 10:23:45 IP:61.155.xxx.xxx 未訂閱
使用 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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-08-22 10:37:29 IP:218.1.xxx.xxx 未訂閱
直接將值寫入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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-08-22 12:37:38 IP:218.1.xxx.xxx 未訂閱
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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-08-22 13:39:03 IP:210.243.xxx.xxx 未訂閱
插花一下, 這樣做與 shinhrn 兄提出的: 
ParamValue := '1003,1004';
  Query1.SQL.Add('Select * From Orders Where OrderID IN (' + ParamValue + ')');
主要差異點在於
smallbridge
一般會員


發表:7
回覆:19
積分:5
註冊:2003-07-29

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-08-22 15:15:56 IP:218.1.xxx.xxx 未訂閱
呵呵,在你不知道SQL 查询语句是什麽的情況下,你如何書寫 ParamValue := ''1003,1004''; Query1.SQL.Add(''Select * From Orders Where OrderID IN ('' + ParamValue + '')''); 這樣的語句?
shaofu
高階會員


發表:5
回覆:136
積分:103
註冊:2003-01-07

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-08-22 16:52:20 IP:210.243.xxx.xxx 未訂閱
引言: 呵呵,在你不知道SQL 查询语句是什麽的情況下,你如何書寫 ParamValue := ''1003,1004''; Query1.SQL.Add(''Select * From Orders Where OrderID IN ('' + ParamValue + '')''); 這樣的語句?
還是不太懂 因為單從您提供的範例來看, 實在看不出來有甚麼特別的地方... 我只是覺的問題好像沒這麼複雜..
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#19 引用回覆 回覆 發表時間:2003-08-23 13:46:55 IP:218.16.xxx.xxx 未訂閱
除了用 ftArray 外,其實用 String 也應該可以的,不過中間每個值都要用 ' 或 " 括起來 (有些數據庫兩者均可有些只接受某個) 如 : Query1.ParamByName('ParamValue').Value := '"254","457","787"';
系統時間:2024-05-18 12:14:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!