17.3 SQL語言編程概述
在Delphi應用程序中的SQL命令語句是包含在TQuery部件的SQL屬性中,TQuery部件的SQL屬性是TString類型的,也就是說SQL屬性值是一個字符串列表,這個字符串列表非常類似於一個字符串類型的數組,有關TString類型的信息請參看聯機幫助。在前一節裡我們介紹了TQuery部件可以執行兩種SQL語句:
● 靜態SQL語句
● 動態SQL語句
靜態SQL語句在程序設計時便已固定下來,它不包含任何參數和變量,例如下面的語句便是一條靜態SQL語句:
Select * From Cusromer Where CustNo = 1234;
而動態SQL語句,也被稱作參數化的語句,在其中間包含著表示字段名或表名的參數,例如下面的語句是一條動態SQL語句:
Select * From Customer Where CustNo =: Number;
其中的變量Number便是一個參數變量,它由一個冒號引導,在程序運行過程中,必須要為該參數賦值,該條SQL語句才能正確執行,每次運行應用程序時可以為該參數變量賦予不同的值。
17.3.1 SQL命令文本的編寫
1. 使用String List Editor編寫
我們要為TQuery部件的SQL屬性設置SQL命令文本時,可以在應用窗體中選擇TQuery部件且雙擊Object Inspector窗口中的SQL屬性,這樣便打開了String List Editor 窗口,在該窗口中我們便可以編寫各種SQL命令,如圖17.3所示。
在編寫完適當的SQL語句之後,選擇 OK 按鈕便可以將編輯器中的 SQL 命令文裝入到TQuery部件的SQL屬性中,選擇SAVE按鈕可以將編寫好的SQL命令保存到一個文件中供以後編程時使用。我們在編寫SQL命令文本時還可以選擇Load按鈕從一個 SQL 命令文件中調入SQL命令。在程序運行過程中,要想設置TQuery部件的SQL屬性,必須首先調用Close方法,關閉TQuery部件,然後再調用Clear方法清除SQL屬性中現存的SQL命令語句,最後再調用Add方法為SQL屬性設置新的SQL命令語句。例如:
Query1.Close {關閉Query1)
Query1.SQL.Clear {清除SQL屬性中的SQL命令語句}
Query1.SQL.Add('Select * From Country');
Query1.SQL.Add('Where Name ="ARGENTINA" ');
在為TQuery部件設置SQL屬性時調用Close方法總是很安全的,如果TQuery部件已經被關閉了,調用Close方法時不會產生任何影響。在應用程序中為SQL屬性設置新的SQL 命令語句時,必須要調用Clear方法以清除SQL屬性中現存的SQL命令語句,如果不調用Clear方法,便調用Add方法向SQL屬性中設置SQL命令語句,那麼新設置的SQL命令語句會追加在現存SQL命令語句後面,在程序運行時常常會出現出乎意料的查詢結果甚至程序無法運行下去。
在這裡要特別注意的,一般情況下TQuery部件的SQL屬性只能包含一條完整的SQL語句,它不允許被設置成多條SQL語句。當然有些數據庫服務器也支持在TQuery部件的SQL屬性中設置多條SQL語句,只要數據庫服務器允許這樣,我們在編程時可以為 SQL 屬性設置多條SQL語句。
2. 使用Visual Query Builder編寫
客戶/服務器版本的Delphi還包含一個可視化的查詢構造器Visual Query Builder ,用這個可視化的工具我們只能編寫Select語句。在應用程序窗體中選擇TQuery部件後,單擊鼠標右鍵,彈出一個彈出式菜單,從中選擇Run Visual Query Builder後便會彈出一對話框提示你選擇要訪問的數據庫,選擇想要訪問的數據庫之後選擇OK按鈕,緊接著會出現一個彈出式對話框提示你選擇要查詢的數據庫表,一次可以選擇多個數據庫表,若要選擇多個數據庫表,每選擇一個表之後單擊Add按鈕,接著選擇另一個表,選擇完要查詢的表之後單擊Close按鈕,這樣,可視化的查詢構造器中將會顯示出用戶選擇的數據庫表。
有關如何使用可視化的查詢構造器Visual Query Builder 請參看聯機幫助信息, 在Visual Query Builder中構造完一個查詢並退出Visual Query Builder時,其中的SQL 命令語句會自動地寫入相應的TQuery部件的SQL屬性。
17.3.2 SQL程序的執行
在為TQuery部件設置完SQL屬性的屬性值之後,也即編寫好適當的SQL程序之後,可以有多種方式來執行SQL程序。
在設計過程中,設置完TQuery部件的SQL屬性之後將其Active屬性的值置為True,這樣便可以執行SQL屬性中的SQL程序,如果應用中有與TQuery部件相連的數據浏覽部件( 如TDDGrid TDBEdit等)那麼在這些數據浏覽部件中會顯示SQL程序的執行結果。
在應用程序運行過程中,通過程序調用TQuery部件的Open方法或ExecSQL 方法可以執行其SQL屬性中的SQL程序。Open方法和ExecSQL方法是不一樣的。大家在程序設計過程中一定要注意。Open方法只能用來執行SQL語言的查詢語句(Select命令),並返回一個查詢結果集,而ExecSQL方法還可以用來執行其它常用的SQL語句(如Insert、UPDATE、 DELETE等命令)例如:
Query1.Open (這樣會返回一個查詢結果集)
如果調用Open方法,而沒有查詢結果時,會出錯。此時應該調用ExecSQL 方法來代替Open方法。如:
Query1.ExecSQL (沒有返回結果)
當然在設計應用程序時,程序設計人員是無法確定TQuery部件中的SQL 語句是否會返回一個查詢結果的。對於這種情況應當用Try…Except模塊來設計程序。在 Try 部分調用Open方法,而在Except部分調用ExceSQL方法,這樣才能保證程序的正確運行。
例如:
Try
Query1.Open
Except
Query1.ExecSQL
End
在應用程序中使用TQuery部件時,還可以設置它的UniDirectional屬性為True,這樣會加快檢索數據庫表的速度,但是這樣只能往一個方向移動記錄指針, 在缺省情況下,UniDirectional屬性的值為False。