17.3.2 SQL程序的執(zhí)行
在為TQuery部件設(shè)置完SQL屬性的屬性值之后,也即編寫好適當(dāng)?shù)腟QL程序之后,可以有多種方式來執(zhí)行SQL程序。
在設(shè)計(jì)過程中,設(shè)置完TQuery部件的SQL屬性之后將其Active屬性的值置為True,這樣便可以執(zhí)行SQL屬性中的SQL程序,如果應(yīng)用中有與TQuery部件相連的數(shù)據(jù)瀏覽部件( 如TDDGrid TDBEdit等)那么在這些數(shù)據(jù)瀏覽部件中會(huì)顯示SQL程序的執(zhí)行結(jié)果。
在應(yīng)用程序運(yùn)行過程中,通過程序調(diào)用TQuery部件的Open方法或ExecSQL 方法可以執(zhí)行其SQL屬性中的SQL程序。Open方法和ExecSQL方法是不一樣的。大家在程序設(shè)計(jì)過程中一定要注意。Open方法只能用來執(zhí)行SQL語言的查詢語句(Select命令),并返回一個(gè)查詢結(jié)果集,而ExecSQL方法還可以用來執(zhí)行其它常用的SQL語句(如Insert、UPDATE、 DELETE等命令)例如:
Query1.Open (這樣會(huì)返回一個(gè)查詢結(jié)果集)
如果調(diào)用Open方法,而沒有查詢結(jié)果時(shí),會(huì)出錯(cuò)。此時(shí)應(yīng)該調(diào)用ExecSQL 方法來代替Open方法。如:
Query1.ExecSQL (沒有返回結(jié)果)
當(dāng)然在設(shè)計(jì)應(yīng)用程序時(shí),程序設(shè)計(jì)人員是無法確定TQuery部件中的SQL 語句是否會(huì)返回一個(gè)查詢結(jié)果的。對(duì)于這種情況應(yīng)當(dāng)用Try…Except模塊來設(shè)計(jì)程序。在 Try 部分調(diào)用Open方法,而在Except部分調(diào)用ExceSQL方法,這樣才能保證程序的正確運(yùn)行。
例如:
Try
Query1.Open
Except
Query1.ExecSQL
End
在應(yīng)用程序中使用TQuery部件時(shí),還可以設(shè)置它的UniDirectional屬性為True,這樣會(huì)加快檢索數(shù)據(jù)庫表的速度,但是這樣只能往一個(gè)方向移動(dòng)記錄指針, 在缺省情況下,UniDirectional屬性的值為False。
17.3.3 通過TQuery部件如何獲得活動(dòng)的數(shù)據(jù)
我們?cè)谇懊娴恼鹿?jié)里介紹TTable部件時(shí),我們知道通過TTable部件從數(shù)據(jù)庫中獲得的數(shù)據(jù)都是活動(dòng)的,也就是說用戶可以直接通過數(shù)據(jù)瀏覽部件對(duì)這些數(shù)據(jù)進(jìn)行編輯修改。而通過TQuery部件可以獲得兩種類型的數(shù)據(jù):
● “活動(dòng)”的數(shù)據(jù)
這種數(shù)據(jù)就跟通過TTable部件獲得的數(shù)據(jù)一樣,用戶可以通過數(shù)據(jù)瀏覽部件來編輯修改這些數(shù)據(jù),并且當(dāng)調(diào)用Post方法或當(dāng)焦點(diǎn)離開當(dāng)前的數(shù)據(jù)瀏覽部件時(shí),用戶對(duì)數(shù)據(jù)的修改自動(dòng)地被寫回到數(shù)據(jù)庫中,詳細(xì)情況請(qǐng)參看第四章“數(shù)據(jù)瀏覽部件的應(yīng)用及編程”。
● 非活動(dòng)的數(shù)據(jù)(只讀數(shù)據(jù))
用戶通過數(shù)據(jù)瀏覽部件是不能修改其中的數(shù)據(jù)。在缺省情況下,通過TQuery部件獲得的查詢結(jié)果數(shù)據(jù)是只讀數(shù)據(jù),要想獲得“活動(dòng)”的數(shù)據(jù),在應(yīng)用程序中必須要設(shè)置TQuery部件的RequestLive屬性值為True,然而并不是在任何情況下(通過設(shè)置RequestLive的屬值True)都可以獲得“活動(dòng)”的數(shù)據(jù)的,要想獲得“活動(dòng)”的數(shù)據(jù),除了將TQuery部件的RequestLive屬性為True外,BDE要能夠返回“活動(dòng)”的數(shù)據(jù),相應(yīng)的SQL命令語句還要滿足附錄C中的語法規(guī)則和下列的約束條件:
TQuery部件獲得“活動(dòng)”的查詢結(jié)果數(shù)據(jù)的約束條件:
當(dāng)查詢Paradox或dBASE數(shù)據(jù)庫中的表:
● 查詢只能涉及到一個(gè)單獨(dú)的表
● SQL語句中不能包含ORDER BY命令
● SQL語句中不能含聚集運(yùn)算符SUM或AVG
● 在Select后的字段列表中不能有計(jì)算字段
● 在Select語句WHERE部分只能包含字段值與常量的比較運(yùn)算,這些比較運(yùn)算符是: Like,>,<,>=,<=,各比較運(yùn)算之間可以有并和交運(yùn)算:AND和OR。
當(dāng)通過SQL語句查詢數(shù)據(jù)庫服務(wù)器中的數(shù)據(jù)庫表:
● 查詢只能涉及到一個(gè)單獨(dú)的表
● SQL語句中不能包含ORDER BY命令
● SQL語句中不能含聚集運(yùn)算符SUM或AVG運(yùn)算
另外,如果是查詢Sybase數(shù)據(jù)庫中的表,那么被查詢的表中只能有一個(gè)索引。
如果在應(yīng)用程序中要求TQuery部件返回一個(gè)“活動(dòng)”的查詢結(jié)果數(shù)據(jù)集,但是SQL 命令語句不滿足上述約束條件時(shí),對(duì)于本地?cái)?shù)據(jù)庫的SQL查詢,BDE只能返回只讀的數(shù)據(jù)集。對(duì)于數(shù)據(jù)庫服務(wù)器中的SQL查詢,只能返回錯(cuò)誤的代碼。當(dāng)TQuery 部件返回一個(gè)“活動(dòng)”的查詢結(jié)果數(shù)據(jù)集時(shí),它的CanModify屬性的值會(huì)被設(shè)置成True。
表17.1 TQuery部件返回查詢結(jié)果數(shù)據(jù)的類型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
RequestLive屬性值 CanModify屬性值 查詢結(jié)果的類型
────────────────────────────────
False False 只讀數(shù)據(jù)
True(SQL語句滿足約束條件) True “活動(dòng)”數(shù)據(jù)
True(SQL語句不滿足約束條件) False 只讀數(shù)據(jù)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
當(dāng)TQuery部件返回只讀的查詢結(jié)果數(shù)據(jù)集,而用戶又希望修改這只讀的數(shù)據(jù)集時(shí),一般這樣來處理,在應(yīng)用程序中另外增加一個(gè) TQuery 部件 Query2( 假設(shè)獲得只讀結(jié)果的TQuery部件的名字是Query1),在Query2中設(shè)置修改語句UpDATE對(duì)Query1 中的數(shù)據(jù)進(jìn)行修改操作,這樣會(huì)實(shí)現(xiàn)對(duì)只讀數(shù)據(jù)的修改。
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |