17.3.3 通過TQuery部件如何獲得活動的數據
我們在前面的章節裡介紹TTable部件時,我們知道通過TTable部件從數據庫中獲得的數據都是活動的,也就是說用戶可以直接通過數據浏覽部件對這些數據進行編輯修改。而通過TQuery部件可以獲得兩種類型的數據:
● “活動”的數據
這種數據就跟通過TTable部件獲得的數據一樣,用戶可以通過數據浏覽部件來編輯修改這些數據,並且當調用Post方法或當焦點離開當前的數據浏覽部件時,用戶對數據的修改自動地被寫回到數據庫中,詳細情況請參看第四章“數據浏覽部件的應用及編程”。
● 非活動的數據(只讀數據)
用戶通過數據浏覽部件是不能修改其中的數據。在缺省情況下,通過TQuery部件獲得的查詢結果數據是只讀數據,要想獲得“活動”的數據,在應用程序中必須要設置TQuery部件的RequestLive屬性值為True,然而並不是在任何情況下(通過設置RequestLive的屬值True)都可以獲得“活動”的數據的,要想獲得“活動”的數據,除了將TQuery部件的RequestLive屬性為True外,BDE要能夠返回“活動”的數據,相應的SQL命令語句還要滿足附錄C中的語法規則和下列的約束條件:
TQuery部件獲得“活動”的查詢結果數據的約束條件:
當查詢Paradox或dBASE數據庫中的表:
● 查詢只能涉及到一個單獨的表
● SQL語句中不能包含ORDER BY命令
● SQL語句中不能含聚集運算符SUM或AVG
● 在Select後的字段列表中不能有計算字段
● 在Select語句WHERE部分只能包含字段值與常量的比較運算,這些比較運算符是: Like,>,<,>=,<=,各比較運算之間可以有並和交運算:AND和OR。
當通過SQL語句查詢數據庫服務器中的數據庫表:
● 查詢只能涉及到一個單獨的表
● SQL語句中不能包含ORDER BY命令
● SQL語句中不能含聚集運算符SUM或AVG運算
另外,如果是查詢Sybase數據庫中的表,那麼被查詢的表中只能有一個索引。
如果在應用程序中要求TQuery部件返回一個“活動”的查詢結果數據集,但是SQL 命令語句不滿足上述約束條件時,對於本地數據庫的SQL查詢,BDE只能返回只讀的數據集。對於數據庫服務器中的SQL查詢,只能返回錯誤的代碼。當TQuery 部件返回一個“活動”的查詢結果數據集時,它的CanModify屬性的值會被設置成True。
表17.1 TQuery部件返回查詢結果數據的類型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
RequestLive屬性值 CanModify屬性值 查詢結果的類型
────────────────────────────────
False False 只讀數據
True(SQL語句滿足約束條件) True “活動”數據
True(SQL語句不滿足約束條件) False 只讀數據
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
當TQuery部件返回只讀的查詢結果數據集,而用戶又希望修改這只讀的數據集時,一般這樣來處理,在應用程序中另外增加一個 TQuery 部件 Query2( 假設獲得只讀結果的TQuery部件的名字是Query1),在Query2中設置修改語句UpDATE對Query1 中的數據進行修改操作,這樣會實現對只讀數據的修改。
17.4 動態SQL語句的編程
在17.3節中,我們已經介紹了動態SQL語句(又被稱為參數化的SQL語句),在其中包含在程序過程中可以變化的參數,在實際的程序設計中使用得更多的是動態SQL語句,因而在這一節裡我們重點介紹如何給動態SQL語句的參數賦值,以在應用程序中靈活地使用SQL語句。動態SQL語句的編寫、執行等等與17.3節中介紹的SQL語句的編寫、執行是一樣的。
動態SQL語句中的參數,我們可以通過兩種途徑來為它賦值:
1. 利用參數編輯器(Parameter Editor)來為參數賦值
具體方法是:選中TQuery部件,單擊鼠標右鍵,然後從中選擇Define Parameters 便可以打開參數編輯器。
例如,在TQuery部件的SQL屬性中我們設置如下的SQL語句:
Setect * From Customer Where CustNO=:Number;
TQuery的DatabaseName屬性為DBDEMOS,其中Number為參數變量。我們便可以為參數Number賦值,在Datetype組合框中選擇該參數的數據類型為整數Integer,在Value編輯框中可以為參數Number賦一個值,也可以單擊Null Value檢查框為參數Number賦一個空值Null。給參數賦值之後,單擊OK按鈕,這樣TQuery部件中的SQL 查詢便准備好了,而且參數值也被賦給了動態SQL語句中相應的參數,此時當把TQuery 部件的Active屬性設置成True時,在與TQuery部件相連的數據浏覽部件中會顯示出查詢結果,通過參數編輯器為參數賦值,這種方式缺乏應有的靈活性,在實際應用中用得較少,在實際應用中程序設計人員希望用更靈活方便的方式為參數賦值,那就是我們接下來要介紹的另一種途徑:
2. 在運行過程中,通過程序為參數賦值
用這種方式為參數賦值有三種方法:
①根據參數在SQL語句中出現的順序,設置TQuery部件的Params屬性值為參數賦值。
②直接根據SQL語句中各參數的名字,調用ParamByName方法來為各參數賦值。
③將TQuery部件的DataSource屬性設置為另一個數據源,這樣將另一個數據源中與當前TQuery部件的SQL語句中的參數名相匹配的字段值賦給其對應的參數。
這三種方法我們將在下面的三小節中具體地介紹