17.4.4 Prepare方法的使用
在使用動態(tài)SQL語句編程時,常常用到一個很重要的方法prepare,調用prepare 方法之后,Delphi會將帶參數(shù)的SQL語句傳送給與其對應的數(shù)據(jù)庫引擎,對動態(tài)SQL語句進行語法分析和優(yōu)化。雖然在用動態(tài)SQL語句編程時,調用prepare方法并不是必須的,但是這里我們要極力推薦調用prepare方法,因為調用prepare方法后,會大大提高動態(tài)SQL 語句的執(zhí)行性能,特別是當要反復多次執(zhí)行同一條動態(tài)SQL語句時,其優(yōu)越性會更加明顯。如果在應用程序中執(zhí)行一條SQL語句之前并沒有顯式地調用prepare方法,每次在執(zhí)行SQL 語句時,Delphi會隱含地調用propare方法以準備這個查詢。
TQuery部件還有一個prepare屬性,這是一個布爾型屬性,當其屬性值為True時,表明該查詢已被準備好了( SQL 語句已被傳送到數(shù)據(jù)庫引擎中 ) ,當我們使用參數(shù)編輯器Parameters Editor來為動態(tài)SQL語句中的參數(shù)賦值時,當設置完相應的參數(shù)值并退出參數(shù)編輯器時,Delphi會隱含地調用prepare方法以準備好查詢。
當SQL語句執(zhí)行完之后,要想準備下一個查詢,首先必須調用close方法,然后才能調用prepare方法準備下一個查詢。一般來說,在一個應用程序中應該調用一次prepare方法,常常在窗體的OnCreate事件處理過程中調用prepare方法,然后用上述介紹的方法為參數(shù)賦值,最后調用Open方法或ExecSQL方法執(zhí)行SQL語句,以完成查詢。
當然在調用prepare方法準備好一個查詢時,會消耗一些數(shù)據(jù)庫資源,因而每當一個查詢執(zhí)行完畢之后,要養(yǎng)成調用Unprepare方法以撤消查詢的好習慣。在運行程序過程中,通過程序改變TQuery部件的SQL屬性值時,Delphi會自動地調用Close方法和Unprepare 方法,以撤消查詢。
17.5 SQL編程實例
我們在學習了SQL程序的編寫方法之后,我們便可以著手創(chuàng)建自己的應用程序了,通過創(chuàng)建應用程序我們對Delphi的強大功能就會有更深刻的印象,同時會進一步全面掌握有關SQL編程的知識,在本節(jié)中我們主要介紹兩個例子,前一個例子主要是用靜態(tài)的SQL語句編程,后一個例子是用動態(tài)SQL語句編程。
17.5.1 設計簡單的SQL程序編輯器
例17.1:在這個例子中,我們設計一個交互式的SQL程序編輯器,在這個編輯器中,我們可以根據(jù)SQL語言的語法規(guī)則,編寫常用的SQL命令,并通過單擊編輯器中的有關的按鈕,直接執(zhí)行編寫好的SQL命令,SQL命令的執(zhí)行結果也會及時地通過一個TDBGrid 部件顯示出來。
表17.3 SQL編輯器中個主要部件的屬性
━━━━━━━━━━━━━━━━━━━━
部 件 屬 性 值
────────────────────
Form1 Caption=SQL程序編輯器
DBGrid1 DataSource=DataSource1
Button1 Caption=執(zhí)行(&E)
Button2 Caption=清除(&C)
Button3 Caption=退出(&X)
Button3 kind=bkClose
Memo1
DataSource1 DataSet=Query1
Query1 DatabaseName=DEMOS
━━━━━━━━━━━━━━━━━━━━
因為我們在設置Query1的DatabaseName屬性時將其設置為DEMOS,所以我們設計的這個SQL程序編輯器只能對DEOMS中的數(shù)據(jù)庫表進行操作。
單擊按鈕Button1的事件處理過程代碼為:
程序清單17.1
procedure TForm1.Button1Click(Sender:TObject);
begin
Query1.close;
Query1.SQL.clear;
Query1.SQL.Add(Memo1.text);
Query1.Open;
end;
單擊按鈕Button2的事件處理過程為:
程序清單17.2
procedure TForm1.Button2Click(Sender:TObject);
begin
Query1.close;
Query1.SQL.clear;
Query1.ExceSQL;
end;
下面我們對程序清單17.1和程序清單17.2中的程序代碼進行簡要的分析:
程序清單17.1中的程序代碼是用來執(zhí)行查詢的。
Query1.close;
這一行程序是用來關閉Query1的,我們在前面的章節(jié)中介紹過,只有在調用close 方法將TQuery部件關閉之后,才能修改其SQL屬性值,執(zhí)行close命令關閉查詢是很安全的,如果查詢已經被關閉了,調用該方法不會產生任何影響。
Query1.SQL.clear;
因為TQuery部件的SQL屬性只能包含一條SQL語句,調用Clear 方法的目的是為了清除SQL屬性原來的屬性值即原來的SQL命令語句,如果不調用clear方法清除原來的SQL命令語句,當在后面的程序中調用Add方法為SQL屬性設置新的SQL命令語句時,Delphi 會將新的SQL命令語句加在原來的SQL命令語句,這樣使得SQL屬性中包含兩條獨立的SQL語句,這是不允許的。
Query1.SQL.Add(Memo.text);
該條命令是將SQL編輯器的編輯區(qū)內的內容(TMemo部件Memo1)設置成Query1的SQL屬性值。
Query1.open;
該語句用來執(zhí)行Query1中的SQL命令語句,如果執(zhí)行查詢從數(shù)據(jù)庫中獲得查詢結果,查詢結果會在數(shù)據(jù)網格DBGrid1中顯示出來。
程序清單2是用來清除查詢的,其前兩行語句跟程序清單1中的代碼是一樣的。Query1.ExecSQL有一些特別,調用ExecSQL方法也是打開Query1,ExecSQL方法與open方法不一樣的,請參看前面的章節(jié),當Query1中SQL屬性值為空時,即沒有SQL語句時,只能調用ExecSQL方法來打開Query1,如果調用 open 方法會返回一個錯誤。 在執(zhí)行完 Query1.ExecSQL語句之后,應用程序將會清除數(shù)據(jù)網格DBGrid1中的所有內容。
相關推薦:2010年9月計算機等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |