不同Query Create的疑問? |
答題得分者是:Justmade
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位! 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 發送簡訊給我 |
方法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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
感謝兩位版主的指導, 這兩種方法都可以做到, 但在我這支程式裡行不通 因為我必須以 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 發送簡訊給我 |
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 發送簡訊給我 |
引言: uses TypInfo TStringList(GetObjectProp(myQuery,'SQL')).Text := 'select * from customer'; 無論是那種 Query 只要 myQuery 是有 SQL 這個 Published Property 而且是 TStringList 來的便可執行,若沒有則會 exception 若你想先測試一下 myQuery 是否有這個 Property 可以用Justmade 兄, 我大略以SetObjectProp()方式取代 myQuery.SQL.Text試 了 open 這段都能正常運作, 應該沒有什麼大問題, Justmade兄, 你真不是"人"啊! 謝謝了!if IsPublishedProp(myQuery,'SQL') then TStringList(GetObjectProp(myQuery,'SQL')).Text := 'select * from customer';若你本身已將 SQL 的資料放在一個 TStringList 裡(如叫 mySQL : TStrings),也可以用 : SetObjectProp(myQuery,'SQL',mySQL); |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |