全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1219
推到 Plurk!
推到 Facebook!

不同Query Create的疑問?

答題得分者是:Justmade
P.D.
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-29 02:44:59 IP:61.66.xxx.xxx 未訂閱
請問各位! var myQuery: TQuery; ... ... myQuery:= TQuery.Create(self) 如果我想以 myQuery 可以適用其他Query類別 例如 [code] if dbftype='Paradox' then myQuery:= TQuery.Create(self) else if dbftype='MSSQL' then myQuery:= TADOQuery.Create(self) else if dbftype='Interbase' then myQuery:= TIBQuery.Create(self); [/coce] 這樣, myQuery 要定義如何的型態, 我查了繼承, 都來自 TDataSet, 但我必須使用Query的property, 如 databasename, sql , 這是 DataSet沒有的, 那得如何執行? 謝謝!
Justmade
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-29 08:10:54 IP:218.16.xxx.xxx 未訂閱
方法1 : 使用時  TypeCast  if dbftype='Paradox' then TQuery(myQuery).Databasename := .....    方法2 : 建立多個變數 : myQuery : TDataSet; myBDEQuery : TQuery; myADOQuery : TADOQuery; myIBQuery : TIBQuery;
if dbftype='Paradox' then 
begin
  myBDEQuery := TQuery.Create(self);
  myQuery := myBDEQuery;
end
else if dbftype='MSSQL' then 
begin
  myADOQuery:= TADOQuery.Create(self)
  myQuery := myADOQuery;
end
else if dbftype='Interbase' then 
begin
  myIBQuery:= TIBQuery.Create(self);
  myQuery := myIBQuery;
end;    if myBDEQuery <> nil then myBDEQuery.DatabaseName := ....;
myQuery.Active := true;
若你把 dbftype 定議為 Enum Type 運作會快點又可用 Case 好看點。 發表人 - Justmade 於 2003/05/29 08:12:30
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-29 08:17:47 IP:218.163.xxx.xxx 未訂閱
var myQuery: TDataSet;
if dbftype='Paradox' then 
  myQuery:= TQuery.Create(self)
...
同樣的也可
if dbftype='Paradox' then 
  TQuery(MyQuery).databasename ....
此外也可用GetPropInfo, GetOrdProp,SetOrdProp等程序存取不確定是否存在之property
P.D.
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-29 10:17:48 IP:61.66.xxx.xxx 未訂閱
感謝兩位版主的指導, 這兩種方法都可以做到, 但在我這支程式裡行不通 因為我必須以 myQuery.SQL.Text:= '...'來做,而且是分布在程式很多位置 以Justmade兄做法 myQuery: TDataSet myBDEQuery: TQuery; myBDEQuery := TQuery.Create(self); myQuery := myBDEQuery; 但我在使用 myQuery.SQL.Text:= '' complier時仍會有 Undeclared identifier 'SQL' 如果使用ccchen兄做法 myQuery: TDataSet; TQuery(myQuery).SQL.Text:= '..' 的確很簡潔, 但在我的程式中所有 myQuery 都必須引用這樣的方式 而InterBase 就必須要引用 TIBQuery(myQuery).SQL.Text 那這樣仍然無法達成我要的程式簡化目的, 因為每一段有這樣的語法 都要做 if dbftype='DB' then TQuery(myQuery).sql... else if dbftype='IB' then TIBQuery(myQuery).sql.... 那與我設定 myQuery: TQuery; myIBQuery: TIBQuery; if dbftype='DB' then myQuery.sql... else if dbftype='IB' then myIBQuery.sql.... 好像沒有太大的差異, 不知兩位版主有沒有更好的辦法, 使用同一個myQuery 可以適用各種database component !
Justmade
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-29 15:07:50 IP:218.16.xxx.xxx 未訂閱
uses TypInfo    TStringList(GetObjectProp(myQuery,'SQL')).Text := 'select * from customer';    無論是那種 Query 只要 myQuery 是有 SQL 這個 Published Property 而且是 TStringList 來的便可執行,若沒有則會 exception    若你想先測試一下 myQuery 是否有這個 Property 可以用
if IsPublishedProp(myQuery,'SQL') then
  TStringList(GetObjectProp(myQuery,'SQL')).Text := 'select * from customer';
若你本身已將 SQL 的資料放在一個 TStringList 裡(如叫 mySQL : TStrings),也可以用 : SetObjectProp(myQuery,'SQL',mySQL);
P.D.
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-29 16:27:28 IP:61.66.xxx.xxx 未訂閱
引言: uses TypInfo TStringList(GetObjectProp(myQuery,'SQL')).Text := 'select * from customer'; 無論是那種 Query 只要 myQuery 是有 SQL 這個 Published Property 而且是 TStringList 來的便可執行,若沒有則會 exception 若你想先測試一下 myQuery 是否有這個 Property 可以用
if IsPublishedProp(myQuery,'SQL') then
  TStringList(GetObjectProp(myQuery,'SQL')).Text := 'select * from customer';
若你本身已將 SQL 的資料放在一個 TStringList 裡(如叫 mySQL : TStrings),也可以用 : SetObjectProp(myQuery,'SQL',mySQL);
Justmade 兄, 我大略以SetObjectProp()方式取代 myQuery.SQL.Text試 了 open 這段都能正常運作, 應該沒有什麼大問題, Justmade兄, 你真不是"人"啊! 謝謝了!
Justmade
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-29 16:37:45 IP:218.16.xxx.xxx 未訂閱
這些 RTTI 的功能我也是來到 K.Top 後才向這裡的各位大哥學的
系統時間:2024-05-05 23:25:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!