全國計算機等級考試二級Delphi輔導講義 170

字號:

17.3.2 SQL程序的執(zhí)行
    在為TQuery部件設(shè)置完SQL屬性的屬性值之后,也即編寫好適當?shù)腟QL程序之后,可以有多種方式來執(zhí)行SQL程序。
    在設(shè)計過程中,設(shè)置完TQuery部件的SQL屬性之后將其Active屬性的值置為True,這樣便可以執(zhí)行SQL屬性中的SQL程序,如果應用中有與TQuery部件相連的數(shù)據(jù)瀏覽部件( 如TDDGrid TDBEdit等)那么在這些數(shù)據(jù)瀏覽部件中會顯示SQL程序的執(zhí)行結(jié)果。
    在應用程序運行過程中,通過程序調(diào)用TQuery部件的Open方法或ExecSQL 方法可以執(zhí)行其SQL屬性中的SQL程序。Open方法和ExecSQL方法是不一樣的。大家在程序設(shè)計過程中一定要注意。Open方法只能用來執(zhí)行SQL語言的查詢語句(Select命令),并返回一個查詢結(jié)果集,而ExecSQL方法還可以用來執(zhí)行其它常用的SQL語句(如Insert、UPDATE、 DELETE等命令)例如:
    Query1.Open (這樣會返回一個查詢結(jié)果集)
    如果調(diào)用Open方法,而沒有查詢結(jié)果時,會出錯。此時應該調(diào)用ExecSQL 方法來代替Open方法。如:
    Query1.ExecSQL (沒有返回結(jié)果)
    當然在設(shè)計應用程序時,程序設(shè)計人員是無法確定TQuery部件中的SQL 語句是否會返回一個查詢結(jié)果的。對于這種情況應當用Try…Except模塊來設(shè)計程序。在 Try 部分調(diào)用Open方法,而在Except部分調(diào)用ExceSQL方法,這樣才能保證程序的正確運行。
    例如:
    Try
    Query1.Open
    Except
    Query1.ExecSQL
    End
    在應用程序中使用TQuery部件時,還可以設(shè)置它的UniDirectional屬性為True,這樣會加快檢索數(shù)據(jù)庫表的速度,但是這樣只能往一個方向移動記錄指針, 在缺省情況下,UniDirectional屬性的值為False。
    17.3.3 通過TQuery部件如何獲得活動的數(shù)據(jù)
    我們在前面的章節(jié)里介紹TTable部件時,我們知道通過TTable部件從數(shù)據(jù)庫中獲得的數(shù)據(jù)都是活動的,也就是說用戶可以直接通過數(shù)據(jù)瀏覽部件對這些數(shù)據(jù)進行編輯修改。而通過TQuery部件可以獲得兩種類型的數(shù)據(jù):
    ● “活動”的數(shù)據(jù)
    這種數(shù)據(jù)就跟通過TTable部件獲得的數(shù)據(jù)一樣,用戶可以通過數(shù)據(jù)瀏覽部件來編輯修改這些數(shù)據(jù),并且當調(diào)用Post方法或當焦點離開當前的數(shù)據(jù)瀏覽部件時,用戶對數(shù)據(jù)的修改自動地被寫回到數(shù)據(jù)庫中,詳細情況請參看第四章“數(shù)據(jù)瀏覽部件的應用及編程”。
    ● 非活動的數(shù)據(jù)(只讀數(shù)據(jù))
    用戶通過數(shù)據(jù)瀏覽部件是不能修改其中的數(shù)據(jù)。在缺省情況下,通過TQuery部件獲得的查詢結(jié)果數(shù)據(jù)是只讀數(shù)據(jù),要想獲得“活動”的數(shù)據(jù),在應用程序中必須要設(shè)置TQuery部件的RequestLive屬性值為True,然而并不是在任何情況下(通過設(shè)置RequestLive的屬值True)都可以獲得“活動”的數(shù)據(jù)的,要想獲得“活動”的數(shù)據(jù),除了將TQuery部件的RequestLive屬性為True外,BDE要能夠返回“活動”的數(shù)據(jù),相應的SQL命令語句還要滿足附錄C中的語法規(guī)則和下列的約束條件:
    TQuery部件獲得“活動”的查詢結(jié)果數(shù)據(jù)的約束條件:
    當查詢Paradox或dBASE數(shù)據(jù)庫中的表:
    ● 查詢只能涉及到一個單獨的表
    ● SQL語句中不能包含ORDER BY命令
    ● SQL語句中不能含聚集運算符SUM或AVG
    ● 在Select后的字段列表中不能有計算字段
    ● 在Select語句WHERE部分只能包含字段值與常量的比較運算,這些比較運算符是: Like,>,<,>=,<=,各比較運算之間可以有并和交運算:AND和OR。
    當通過SQL語句查詢數(shù)據(jù)庫服務器中的數(shù)據(jù)庫表:
    ● 查詢只能涉及到一個單獨的表
    ● SQL語句中不能包含ORDER BY命令
    ● SQL語句中不能含聚集運算符SUM或AVG運算
    另外,如果是查詢Sybase數(shù)據(jù)庫中的表,那么被查詢的表中只能有一個索引。
    如果在應用程序中要求TQuery部件返回一個“活動”的查詢結(jié)果數(shù)據(jù)集,但是SQL 命令語句不滿足上述約束條件時,對于本地數(shù)據(jù)庫的SQL查詢,BDE只能返回只讀的數(shù)據(jù)集。對于數(shù)據(jù)庫服務器中的SQL查詢,只能返回錯誤的代碼。當TQuery 部件返回一個“活動”的查詢結(jié)果數(shù)據(jù)集時,它的CanModify屬性的值會被設(shè)置成True。
    表17.1 TQuery部件返回查詢結(jié)果數(shù)據(jù)的類型
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    RequestLive屬性值 CanModify屬性值 查詢結(jié)果的類型
    ────────────────────────────────
    False False 只讀數(shù)據(jù)
    True(SQL語句滿足約束條件) True “活動”數(shù)據(jù)
    True(SQL語句不滿足約束條件) False 只讀數(shù)據(jù)
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    當TQuery部件返回只讀的查詢結(jié)果數(shù)據(jù)集,而用戶又希望修改這只讀的數(shù)據(jù)集時,一般這樣來處理,在應用程序中另外增加一個 TQuery 部件 Query2( 假設(shè)獲得只讀結(jié)果的TQuery部件的名字是Query1),在Query2中設(shè)置修改語句UpDATE對Query1 中的數(shù)據(jù)進行修改操作,這樣會實現(xiàn)對只讀數(shù)據(jù)的修改。