?? 041.htm
字號:
<p>③通過調用TQuery部件的Open方法或ExecSQl方法執行 SQL 命令。 Open
方法只執行Select命令,ExecSQL方法還可以執行其它的SQL命令。Open方法和ExecSQL
方法的區別我們在后面的章節里會進一步地加以討論的。</p>
<p>如果使用動態SQL語句,首先調用prepare方法,給動態SQL語句中的參數賦值,
然后再調用Open方法或ExecSQL方法。調用propare 方法并不是必須的,
但是對于要多次執行TQuery部件中SQL屬性中的動態SQL語句,調用Prepare可以大大提高TQuery部件執行SQL語句的性能。 </p>
<p>17.2.2 在TQuery部件中編寫簡單的SQL查詢命令 </p>
<p>在這一節里我們將學習如何使用TQuery部件編寫簡單的SQL查詢命令,并在Delphi
應用程序中實現SQL查詢。</p>
<p>例如,如果我們想查詢出表Customer.DB中客戶的編號和公司名稱,
我們按下列步驟來實現:</p>
<p>①在應用窗體中放置一個TQuery部件、一個TDataSource部件一個TDataGrid部件,并將它們連接起來 </p>
<p>②設置窗體TQuery 部件Query1的DatabaseName屬性值為DBDEMOS</p>
<p>③雙擊Object Inspector窗口中Query1的SQL 屬性, Delphi 將顯示 String List
Editor窗口。</p>
<p>④在圖17.3中的窗口中輸入SQL語句:</p>
<p>Select CustNo,Company From Custormer;</p>
<p>⑤單擊OK按鈕,關閉String List Editor窗口。</p>
<p>⑥設置Query的Open屬性為True。</p>
<p>17.3 SQL語言編程概述 </p>
<p>在Delphi應用程序中的SQL命令語句是包含在TQuery部件的SQL屬性中,TQuery部件的SQL屬性是TString類型的,也就是說SQL屬性值是一個字符串列表,
這個字符串列表非常類似于一個字符串類型的數組,有關TString類型的信息請參看聯機幫助。
在前一節里我們介紹了TQuery部件可以執行兩種SQL語句:</p>
<p>● 靜態SQL語句</p>
<p>● 動態SQL語句 </p>
<p>靜態SQL語句在程序設計時便已固定下來,它不包含任何參數和變量,
例如下面的語句便是一條靜態SQL語句: </p>
<p>Select * From Cusromer Where CustNo = 1234; </p>
<p>而動態SQL語句,也被稱作參數化的語句,在其中間包含著表示字段名或表名的參數,例如下面的語句是一條動態SQL語句: </p>
<p>Select * From Customer Where CustNo =: Number;</p>
<p> </p>
<p>其中的變量Number便是一個參數變量,它由一個冒號引導,在程序運行過程中,必須要為該參數賦值,該條SQL語句才能正確執行,
每次運行應用程序時可以為該參數變量賦予不同的值。</p>
<p> </p>
<p>17.3.1 SQL命令文本的編寫</p>
<p> </p>
<p>1. 使用String List Editor編寫</p>
<p>我們要為TQuery部件的SQL屬性設置SQL命令文本時,可以在應用窗體中選擇TQuery部件且雙擊Object
Inspector窗口中的SQL屬性,這樣便打開了String List Editor
窗口,在該窗口中我們便可以編寫各種SQL命令,如圖17.3所示。</p>
<p>在編寫完適當的SQL語句之后,選擇 OK 按鈕便可以將編輯器中的 SQL
命令文裝入到TQuery部件的SQL屬性中,選擇SAVE按鈕可以將編寫好的SQL命令保存到一個文件中供以后編程時使用。我們在編寫SQL命令文本時還可以選擇Load按鈕從一個
SQL 命令文件中調入SQL命令。在程序運行過程中,要想設置TQuery部件的SQL屬性,必須首先調用Close方法,關閉TQuery部件,然后再調用Clear方法清除SQL屬性中現存的SQL命令語句,
最后再調用Add方法為SQL屬性設置新的SQL命令語句。例如:</p>
<p> </p>
<p>Query1.Close {關閉Query1)</p>
<p>Query1.SQL.Clear {清除SQL屬性中的SQL命令語句}</p>
<p>Query1.SQL.Add('Select * From Country');</p>
<p>Query1.SQL.Add('Where Name ="ARGENTINA" ');</p>
<p> </p>
<p>在為TQuery部件設置SQL屬性時調用Close方法總是很安全的,如果TQuery部件已經被關閉了,調用Close方法時不會產生任何影響。在應用程序中為SQL屬性設置新的SQL
命令語句時,必須要調用Clear方法以清除SQL屬性中現存的SQL命令語句,如果不調用Clear方法,便調用Add方法向SQL屬性中設置SQL命令語句,那么新設置的SQL命令語句會追加在現存SQL命令語句后面,
在程序運行時常常會出現出乎意料的查詢結果甚至程序無法運行下去。</p>
<p>在這里要特別注意的,一般情況下TQuery部件的SQL屬性只能包含一條完整的SQL語句,它不允許被設置成多條SQL語句。當然有些數據庫服務器也支持在TQuery部件的SQL屬性中設置多條SQL語句,只要數據庫服務器允許這樣,我們在編程時可以為
SQL 屬性設置多條SQL語句。</p>
<p>2. 使用Visual Query Builder編寫</p>
<p>客戶/服務器版本的Delphi還包含一個可視化的查詢構造器Visual Query
Builder ,用這個可視化的工具我們只能編寫Select語句。在應用程序窗體中選擇TQuery部件后,單擊鼠標右鍵,彈出一個彈出式菜單,從中選擇Run
Visual Query Builder后便會彈出一對話框提示你選擇要訪問的數據庫,選擇想要訪問的數據庫之后選擇OK按鈕,緊接著會出現一個彈出式對話框提示你選擇要查詢的數據庫表,一次可以選擇多個數據庫表,若要選擇多個數據庫表,每選擇一個表之后單擊Add按鈕,接著選擇另一個表,
選擇完要查詢的表之后單擊Close按鈕,這樣,可視化的查詢構造器中將會顯示出用戶選擇的數據庫表。 </p>
<p>有關如何使用可視化的查詢構造器Visual Query Builder
請參看聯機幫助信息, 在Visual Query Builder中構造完一個查詢并退出Visual
Query Builder時,其中的SQL 命令語句會自動地寫入相應的TQuery部件的SQL屬性。 </p>
<p>17.3.2 SQL程序的執行 </p>
<p>在為TQuery部件設置完SQL屬性的屬性值之后,也即編寫好適當的SQL程序之后,可以有多種方式來執行SQL程序。</p>
<p>在設計過程中,設置完TQuery部件的SQL屬性之后將其Active屬性的值置為True,
這樣便可以執行SQL屬性中的SQL程序,如果應用中有與TQuery部件相連的數據瀏覽部件(
如TDDGrid TDBEdit等)那么在這些數據瀏覽部件中會顯示SQL程序的執行結果。</p>
<p>在應用程序運行過程中,通過程序調用TQuery部件的Open方法或ExecSQL
方法可以執行其SQL屬性中的SQL程序。Open方法和ExecSQL方法是不一樣的。
大家在程序設計過程中一定要注意。Open方法只能用來執行SQL語言的查詢語句(Select命令),
并返回一個查詢結果集,而ExecSQL方法還可以用來執行其它常用的SQL語句(如Insert、UPDATE、
DELETE等命令)例如:</p>
<p> </p>
<p>Query1.Open (這樣會返回一個查詢結果集)</p>
<p> </p>
<p>如果調用Open方法,而沒有查詢結果時,會出錯。此時應該調用ExecSQL
方法來代替Open方法。如:</p>
<p> </p>
<p>Query1.ExecSQL (沒有返回結果)</p>
<p> </p>
<p>當然在設計應用程序時,程序設計人員是無法確定TQuery部件中的SQL
語句是否會返回一個查詢結果的。對于這種情況應當用Try…Except模塊來設計程序。在
Try 部分調用Open方法,而在Except部分調用ExceSQL方法,這樣才能保證程序的正確運行。</p>
<p>例如:</p>
<p> </p>
<p>Try</p>
<p>Query1.Open</p>
<p>Except</p>
<p>Query1.ExecSQL</p>
<p>End</p>
<p> </p>
<p>在應用程序中使用TQuery部件時,還可以設置它的UniDirectional屬性為True,這樣會加快檢索數據庫表的速度,
但是這樣只能往一個方向移動記錄指針, 在缺省情況下,UniDirectional屬性的值為False。</p>
<p> </p>
<p>17.3.3 通過TQuery部件如何獲得活動的數據</p>
<p> </p>
<p>我們在前面的章節里介紹TTable部件時,我們知道通過TTable部件從數據庫中獲得的數據都是活動的,也就是說用戶可以直接通過數據瀏覽部件對這些數據進行編輯修改。而通過TQuery部件可以獲得兩種類型的數據:</p>
<p>● “活動”的數據</p>
<p>這種數據就跟通過TTable部件獲得的數據一樣,用戶可以通過數據瀏覽部件來編
輯修改這些數據,并且當調用Post方法或當焦點離開當前的數據瀏覽部件時,用戶對數據的修改自動地被寫回到數據庫中,詳細情況請參看第四章“數據瀏覽部件的應用及編程”。</p>
<p>● 非活動的數據(只讀數據)</p>
<p>用戶通過數據瀏覽部件是不能修改其中的數據。在缺省情況下,通過TQuery部件
獲得的查詢結果數據是只讀數據,要想獲得“活動”的數據,在應用程序中必須要設置TQuery部件的RequestLive屬性值為True,然而并不是在任何情況下(通過設置RequestLive的屬值True)都可以獲得“活動”的數據的,要想獲得“活動”的數據,除了將TQuery部件的RequestLive屬性為True外,BDE要能夠返回“活動”的數據,相應的SQL命令語句還要滿足附錄C中的語法規則和下列的約束條件:</p>
<p>TQuery部件獲得“活動”的查詢結果數據的約束條件:</p>
<p> </p>
<p>當查詢Paradox或dBASE數據庫中的表:</p>
<p>● 查詢只能涉及到一個單獨的表</p>
<p>● SQL語句中不能包含ORDER BY命令</p>
<p>● SQL語句中不能含聚集運算符SUM或AVG</p>
<p>● 在Select后的字段列表中不能有計算字段</p>
<p>● 在Select語句WHERE部分只能包含字段值與常量的比較運算,這些比較運算符是:
Like,>,<,>=,<=,各比較運算之間可以有并和交運算:AND和OR。</p>
<p> </p>
<p>當通過SQL語句查詢數據庫服務器中的數據庫表:</p>
<p>● 查詢只能涉及到一個單獨的表</p>
<p>● SQL語句中不能包含ORDER BY命令</p>
<p>● SQL語句中不能含聚集運算符SUM或AVG運算</p>
<p> </p>
<p>另外,如果是查詢Sybase數據庫中的表,那么被查詢的表中只能有一個索引。</p>
<p>如果在應用程序中要求TQuery部件返回一個“活動”的查詢結果數據集,但是SQL
命令語句不滿足上述約束條件時,對于本地數據庫的SQL查詢,BDE只能返回只讀的數據集。對于數據庫服務器中的SQL查詢,只能返回錯誤的代碼。當TQuery
部件返回一個“活動”的查詢結果數據集時,它的CanModify屬性的值會被設置成True。</p>
<p> </p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -