Query的ParamByName請教 |
答題得分者是:Justmade
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
各位前輩 如下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 發送簡訊給我 |
引言: 各位前輩 如下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:35Query1.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 發送簡訊給我 |
基本上有兩種做法 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 發送簡訊給我 |
你好, 我通常是這樣寫的
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 發送簡訊給我 |
謝謝各位前輩的指點﹒ 請問小弟如下各种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 發送簡訊給我 |
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 發送簡訊給我 |
|
cmj
高階會員 發表:15 回覆:242 積分:226 註冊:2002-06-12 發送簡訊給我 |
你的語法是沒錯,但是有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 發送簡訊給我 |
|
chfamy
中階會員 發表:87 回覆:161 積分:54 註冊:2002-05-03 發送簡訊給我 |
|
cmj
高階會員 發表:15 回覆:242 積分:226 註冊:2002-06-12 發送簡訊給我 |
引言: 謝謝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 發送簡訊給我 |
謝謝前輩指點﹒ 可是還是不行﹐小弟在控制台中設定的日期格式為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 發送簡訊給我 |
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
TyroneYeh
一般會員 發表:5 回覆:12 積分:3 註冊:2006-09-27 發送簡訊給我 |
為什麼我用 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 發送簡訊給我 |
|
TyroneYeh
一般會員 發表:5 回覆:12 積分:3 註冊:2006-09-27 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |