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

Query的ParamByName請教

答題得分者是:Justmade
cashxin2002
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-26 01:56:06 IP:63.84.xxx.xxx 未訂閱
各位前輩 如下SQL語法﹕ procedure TForm1.Button3Click(Sender: TObject); begin Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('insert into test (name, age) values (:name, :age)'); Query1.ParamByName('name').AsString := Edit1.Text; Query1.ParamByName('age').AsInteger := ? ; Query1.ExecSQL; end; 請問name欄位為字串形態﹐以Edit1.Text值即可取得﹐但age欄位為數字形態﹐且以Edit2的Text值為資料內容﹐請為?處的程式碼該如何寫﹖ 如果還有其它如日期形態﹑時間形態﹑邏輯形態﹐ParamByName的程式碼又該如何擬寫﹖ 謝謝﹗ 努力,相信會獲得美麗! 忻晟 發表人 - cashxin2002 於 2003/06/26 02:05:35
------
忻晟
P.D.
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-26 02:37:29 IP:61.66.xxx.xxx 未訂閱
引言: 各位前輩 如下SQL語法﹕ procedure TForm1.Button3Click(Sender: TObject); begin Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('insert into test (name, age) values (:name, :age)'); Query1.ParamByName('name').AsString := Edit1.Text; Query1.ParamByName('age').AsInteger := ? ; Query1.ExecSQL; end; 請問name欄位為字串形態﹐以Edit1.Text值即可取得﹐但age欄位為數字形態﹐且以Edit2的Text值為資料內容﹐請為?處的程式碼該如何寫﹖ 如果還有其它如日期形態﹑時間形態﹑邏輯形態﹐ParamByName的程式碼又該如何擬寫﹖ 謝謝﹗ 努力,相信會獲得美麗! 忻晟 發表人 - cashxin2002 於 2003/06/26 02:05:35
Query1.ParamByName('age').AsInteger := StrtoInt(xxx); 即然你宣告了AsInteger, 當然對方也必須為 Integer, 所以利用 Str轉Int的 function(當然不只這個) 另外你也可以這樣做 則對方視 age 的型態為何, 做相對應的指定即可 如age為 double Query1.ParamByName('age').Value := StrtoFloat(xxx); 同理, 如果是日期 Query1.ParamByName('xdate').Value := StrtoDate(xxx); 我會比較建議指定的左方儘量採用value來做比較好!
Justmade
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-26 08:42:27 IP:218.16.xxx.xxx 未訂閱
基本上有兩種做法 1. 自動轉換 不理原本是甚麼形態,通手 AsString 然後給他 String 資料 (其他 AsXXXX 也可) Query1.ParamByName('age').AsString := Edit2.Text ; Query1.ParamByName('Date').AsInteger := Edit3.Text ; 這個做法是寫作方便,大部份的情況也可行不會出錯,不過自動的東西始終有時會自動錯了的 (若資料跟本不對例如 Edit2.Text 不是 integer / Edit3.Text 不是有效的 Date 便用那種方法都會出錯的) 2. 手動轉換 像 PD 兄所指的指定應有的形態給 Param Query1.ParamByName('age').AsInteger := StrToInt(Edit2.Text) ; Query1.ParamByName('age').Value := StrToInt ; 是 Value 通用一點沒錯因為甚麼形態也可用,但其實 AsInteger 反而會有效能一點因為不用先把資料轉做 Variant 然後轉回 integer 其他的如 : Query1.ParamByName('Date').AsDate := StrToDate(Edit3.Text) ; Query1.ParamByName('Date').AsDate := Date; Query1.ParamByName('AdminRight').AsBoolean := StrToBool(Edit4.Text); Query1.ParamByName('AdminRight').AsBoolean := CheckBox1.Checked; 等等
anny
一般會員


發表:1
回覆:5
積分:1
註冊:2003-04-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-26 16:58:55 IP:210.202.xxx.xxx 未訂閱
你好, 我通常是這樣寫的 procedure TForm1.Button3Click(Sender: TObject); begin Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('insert into test (name, age) values ( '); Query1.SQL.Add(fomrat(' ''%s'' , ',[Edit1.text])); Query1.SQL.Add(format(' %s) ',[Edit2.text])); //Query1.SQL.SaveToFile('c:\test\test.txt'); Query1.ExecSQL; end; 即然你的sql 已經是個組合出來的文字了, 直接用 format 函數將你要的資料加入進去就不必宣告變數來存放。 而執行出來的sql 我可以透過 sql.savetofile 來傳成文字檔去做檢查 缺點就是要花點眼力去看sql有沒有下錯。 例如 Query1.SQL.Add(fomrat(' ''%s'' , ',[Edit1.text])); 這一行, 在 format函數裡 ' 單引號有其特殊意義, 如果你 sql 裡也要一個單引號就必須再加一個單引號才能區別!
cashxin2002
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-26 21:45:16 IP:63.84.xxx.xxx 未訂閱
謝謝各位前輩的指點﹒ 請問小弟如下各种ParamByName的寫法是否正确﹕ 1.age欄位為數字形態時﹕ Query1.ParamByName('age').AsInteger := StrtoInt(Edit1.Text); Query1.ParamByName('age').Value := StrtoInt(Edit1.Text); Query1.ParamByName('age').AsInteger := 100; Query1.ParamByName('age').Value := 100; 2.First欄位為字串型態時﹕ Query1.ParamByName('FirstName').AsString := Edit1.Text; Query1.ParamByName('FirstName').Value := Edit.Text; Query1.ParamByName('FirstName').AsString := '忻晟'; Query1.ParamByName('FirstName').Value := '忻晟'; 3.Date欄位為日期型態時﹕ Query1.ParamByName('Date').AsDate := StrToDate(Edit1.Text); Query1.ParamByName('Date').Value := StrToDate(Edit1.Text); Query1.ParamByName('Date').AsDate := 26/06/2003; Query1.ParamByName('Date').Value := 26/06/2003; //當小弟測試第三﹑四句時﹐發現資料庫中不會顯示26/06/2003這個日期﹐而是 //出現30/12/1899這個日期﹐似乎是預設值一樣﹐請問是何原因﹖ 4.Marry欄位為布林型態時﹕ Query1.ParamByName('Marry').AsBoolean := StrToBool(Edit1.Text); Query1.ParamByName('Marry').Value := StrToBool(Edit1.Text); Query1.ParamByName('Marry').AsBoolean := StrToBool(CheckBox1.Checked); Query1.ParamByName('Marry').Value := StrToBool(CheckBox1.Checked); Query1.ParamByName('Marry').AsBoolean := CheckBox1.Checked; Query1.ParamByName('Marry').Value := CheckBox1.Checked; Query1.ParamByName('Marry').Value := True; 努力,相信會獲得美麗! 忻晟
------
忻晟
Justmade
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-26 22:28:43 IP:219.130.xxx.xxx 未訂閱
1.age欄位為數字形態時﹕ Query1.ParamByName('age').AsInteger := StrtoInt(Edit1.Text); Query1.ParamByName('age').Value := StrtoInt(Edit1.Text); Query1.ParamByName('age').AsInteger := 100; Query1.ParamByName('age').Value := 100; Query1.ParamByName('age').AsString := Edit1.Text; 2.First欄位為字串型態時﹕ Query1.ParamByName('FirstName').AsString := Edit1.Text; Query1.ParamByName('FirstName').Value := Edit.Text; Query1.ParamByName('FirstName').AsString := '忻晟'; Query1.ParamByName('FirstName').Value := '忻晟'; 3.Date欄位為日期型態時﹕ Query1.ParamByName('Date').AsDate := StrToDate(Edit1.Text); Query1.ParamByName('Date').Value := StrToDate(Edit1.Text); Query1.ParamByName('Date').AsString := Edit1.Text; Query1.ParamByName('Date').AsDate := EncodeDate(2003,6,26); Query1.ParamByName('Date').AsString := '26/06/2003'; //當小弟測試第三﹑四句時﹐發現資料庫中不會顯示26/06/2003這個日期﹐而是 //出現30/12/1899這個日期﹐似乎是預設值一樣﹐請問是何原因﹖ 你給他的值是 26 除 6 除 2003 接近 0 所以就是預設值啦,因為日期值其實就是30/12/1899後的幾天,你給他0天所以便是當日 4.Marry欄位為布林型態時﹕ Query1.ParamByName('Marry').AsBoolean := StrToBool(Edit1.Text); Query1.ParamByName('Marry').Value := StrToBool(Edit1.Text); Query1.ParamByName('Marry').AsBoolean := StrToBool(CheckBox1.Checked); Query1.ParamByName('Marry').Value := StrToBool(CheckBox1.Checked); Query1.ParamByName('Marry').AsBoolean := CheckBox1.Checked; Query1.ParamByName('Marry').Value := CheckBox1.Checked; Query1.ParamByName('Marry').Value := True; Query1.ParamByName('Marry').AsString := Edit1.Text; 努力,相信會獲得美麗! 忻晟 [/quote]
cashxin2002
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-06-26 22:44:40 IP:63.84.xxx.xxx 未訂閱
謝謝Justmade前輩指點﹒ 那就是說小弟寫的那些語法并沒有錯誤﹖ 另外一些是前輩的補充對嗎﹖ 謝謝﹗ 努力,相信會獲得美麗! 忻晟
------
忻晟
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-06-26 23:25:21 IP:211.76.xxx.xxx 未訂閱
你的語法是沒錯,但是有run time bug
 Edit1.Text='' , StrtoInt, StrToBool,StrToDate不通過
 Edit1.Text='26/02/2002' , StrToDate不通過
所以字串轉其他型態要處理錯誤狀況.
如
Try 
  Query1.ParamByName('age').AsInteger := StrToInt(Edit1.Text);
Except
  Query1.ParamByName('age').AsInteger := 0;
end;    
cashxin2002
版主


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-06-26 23:42:35 IP:63.84.xxx.xxx 未訂閱
謝謝Justmade和cmj前輩的指點﹒小弟明白了﹒ 但執行其中Query1.ParamByName('Date').AsString := '26/06/2003'; 系統出現:Type Mismatch in expression 錯誤信息提示﹒ 謝謝﹗ 努力,相信會獲得美麗! 忻晟
------
忻晟
chfamy
中階會員


發表:87
回覆:161
積分:54
註冊:2002-05-03

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-06-26 23:49:24 IP:61.219.xxx.xxx 未訂閱
Query1.ParamByName(''Date'').AsString := ''26/06/2003'';    26/06/2003 --> MM/DD/YYYY格式
cmj
高階會員


發表:15
回覆:242
積分:226
註冊:2002-06-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-06-26 23:52:47 IP:211.76.xxx.xxx 未訂閱
引言: 謝謝Justmade和cmj前輩的指點﹒小弟明白了﹒ 但執行其中Query1.ParamByName('Date').AsString := '26/06/2003'; 系統出現:Type Mismatch in expression 錯誤信息提示﹒ 謝謝﹗ StrToDate字串格式yyyy/mm/dd Query1.ParamByName('Date').AsString := '2003/06/26'; or Query1.ParamByName('Date').AsDate := StrToDate('2003/06/26'); 努力,相信會獲得美麗! 忻晟
cashxin2002
版主


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-06-27 00:01:19 IP:63.84.xxx.xxx 未訂閱
謝謝前輩指點﹒ 可是還是不行﹐小弟在控制台中設定的日期格式為dd/mm/yyyy﹐在使用 Query1.ParamByName('Date').AsDate := EncodeDate(2003,6,26); 沒有問題﹒ 小弟程式碼貼上﹐請各位前輩指教﹕ procedure TForm1.Button2Click(Sender: TObject); begin Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('Insert Into employee.db (EmpNo,LastName,FirstName,HireDate) Values (:EmpNo,:LastName,:FirstName,:HireDate)'); Query1.ParamByName('Empno').AsString := '153'; Query1.ParamByName('LastName').AsString := 'Nuo'; Query1.ParamByName('FirstName').AsString := 'Xin'; Query1.ParamByName('HireDate').AsString := '26/06/2003'; Query1.ExecSQL; end; 謝謝﹗ 努力,相信會獲得美麗! 忻晟
------
忻晟
Justmade
版主


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-06-27 00:08:20 IP:219.130.xxx.xxx 未訂閱
Date 的 AsString 不單要配合電腦設定還要配合數據庫,例如 Local SQL (paradox / dbase 等) 就一定要是 MM/DD/YYYY 所以需然理論上可行但不鼓勵使用,因其是各人的電腦設定也不同便更亂了 所以最有效的還是他是甚麼類形就 As 甚麼,錯的機會少又有效率 (不用 Value 的多二次 Variant 轉換)。 其他的只好在不能用這方法時備用好了。
cashxin2002
版主


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-06-27 00:14:51 IP:63.84.xxx.xxx 未訂閱
謝謝各位前輩的指點﹒ 努力,相信會獲得美麗! 忻晟
------
忻晟
TyroneYeh
一般會員


發表:5
回覆:12
積分:3
註冊:2006-09-27

發送簡訊給我
#15 引用回覆 回覆 發表時間:2007-01-31 15:45:24 IP:211.22.xxx.xxx 訂閱
為什麼我用 Delphi 7 用 BDE Query 下 Query1.SQL.Add('Select * from :PERSON');
Query1.ParamByName('PERSON').AsString := 'test';
ShowMessage(Query1.SQL.Text);

內容還是 'Select * from :PERSON' 呢?
Query1.Open; 也是出現錯誤!

是那理有問題嗎? 謝謝
------
線上發票登錄自動對獎管理 http://siryeh.com
--
Best Respects,
TyroneYeh
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#16 引用回覆 回覆 發表時間:2007-02-01 03:54:27 IP:124.10.xxx.xxx 訂閱
Table Name 不可使用參數
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
TyroneYeh
一般會員


發表:5
回覆:12
積分:3
註冊:2006-09-27

發送簡訊給我
#17 引用回覆 回覆 發表時間:2007-02-01 10:27:20 IP:211.21.xxx.xxx 訂閱
了解,謝謝

===================引 用 文 章===================
Table Name 不可使用參數
------
線上發票登錄自動對獎管理 http://siryeh.com
--
Best Respects,
TyroneYeh
系統時間:2024-05-06 19:46:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!