| 後一頁 前一頁 回目錄 回首頁 |
SQL語言作為關係資料庫管理系統中的一種一般的的結構查詢語言, 已經被眾多的資料庫管理系統所採用,如ORACLE、Sybase、Informix等資料庫管理系統,它們都支援SQL 語言。Delphi與使用SQL語言的資料庫管理系統相容,在使用Delphi開發資料庫應用程式時,我們可以使用SQL語言程式設計,支援SQL程式設計是Delphi的一個重要特征,這也是體現Delphi作為一個強大的資料庫應用開發工具的一個重要標誌。 17.1 SQL語言簡介 17.1.1 SQL的歷史 在70年代初,E.E.Codd首先提出了關係模型。70年代中期,IBM公司在研制 SYSTEM R關係資料庫管理系統中研制了SQL語言,最早的SQL語言(叫SEQUEL2)是在1976 年 11 月的IBM Journal of R&D上公佈的。1979年ORACLE公司首先提供商用的SQL,IBM公司在DB2 和SQL/DS資料庫系統中也實現了SQL。 1986年10月,美國ANSI採用SQL作為關係資料庫管理系統的標準語言(ANSI X3. 135-1986),後為國際標準化群群組織(ISO)採納為國際標準。1989年,美國ANSI採納在ANSI X3.135-1989報告中定義的關係資料庫管理系統的SQL標準語言,稱為ANSI SQL 89, 該標準替代ANSI X3.135-1986版本。該標準為下列群群組織所採納: ● 國際標準化群群組織(ISO),為ISO 9075-1989報告“Database Language SQL With Integrity Enhancement” ● 美國聯邦政府,發佈在The Federal Information Processing Standard Publication(FIPS PUB)127 目前,所有主要的關係資料庫管理系統支援某些形式的SQL語言, 大部分資料庫打算遵守ANSI SQL89標準。 17.1.2 SQL的優點 SQL廣泛地被採用正敘述了它的優點。它使全部用戶,包括應用程式員、DBA管理員和終端用戶受益非淺。 (1) 非過程化語言 SQL是一個非過程化的語言,因為它一次處理一個記錄,對數據提供自動導航。SQL允許用戶在高層的數據結構上工作,而不對單個記錄進行操作,可操作記錄集。所有SQL 語句接受集合作為輸入,返回集合作為輸出。SQL的集合特性允許一條SQL語句的結果作為另一條SQL語句的輸入。 SQL不要求用戶指定對數據的存放方法。 這種特性使用戶更易集中精力於要得到的結果。所有SQL語句使用查詢優化器,它是RDBMS的一部分,由它決定對指定數據存取的最快速度的手段。查詢優化器知道存在什麼索引,哪兒使用合適,而用戶從不需要知道表是否有索引,表有什麼型式的索引。 (2) 統一的語言 SQL可用於所有用戶的DB活動模型,包括系統管理員、資料庫管理員、 應用程式員、決策支援系統人員及許多其它型式的終端用戶。基本的SQL 命令只需很少時間就能學會,最進階的命令在幾天內便可掌握。 SQL為許多工提供了命令,包括: ● 查詢數據 ● 在表中插入、修改和解除記錄 ● 建立、修改和解除數據物件 ● 控制對數據和數據物件的存取 ● 保證資料庫一致性和完整性
以前的資料庫管理系統為上述各類操作提供單獨的語言,而SQL 將全部任務統一在一種語言中。 (3) 是所有關係資料庫的公共語言 由於所有主要的關係資料庫管理系統都支援SQL語言,用戶可將使用SQL的技能從一個RDBMS轉到另一個。所有用SQL編寫的程式都是可以移植的。
17.2 TQuery部件在SQL程式設計中的運用
在Delphi中是通過TQuery部件來實現對SQL語言支援的,也就是說用Delphi 開發資料庫應用程式時,使用SQL語言操作資料庫中的數據的唯一途徑是經過TQuery部件。 TQuery部件在Delphi中使用SQL語言程式設計時佔居著絕對重要的地位。在使用Delphi 開發的資料庫應用中,可以使用SQL語言存取下列三個方面的資料庫: ● Paradox或dBASE資料庫中的表 在存取這些桌面資料庫系統中的數據時,只能使用ANSI標準的SQL語言中的部分SQL 語句,它們主要包括:Select、Insert、Update和Delete語句;即本地SQL語句。有關詳細情況請參見附錄“局部SQL語句的使用”。 ● 本地InterBase資料庫伺服器中的資料庫 在InterBase資料庫中支援的SQL語句, 在Delphi中都可以使用。有關InterBase中SQL語句的語法和限制,請參看“InterBase的語言參考”。 ● 遠端資料庫伺服器中的資料庫 當然這要求在Delphi中必須裝設相應的SQL Link。只要是資料庫伺服器上的DBMS支援的SQL語句,在Delphi中都可以使用。有關語法 及限制請參看相關的資料庫管理 系統的文檔。
值得一提的是,Delphi還支援異構查詢,即可以同時查詢多個資料庫伺服器中相同的或不同型式的資料庫表,例如查詢的數據可以是來自ORACLE資料庫中的表和Sybase資料庫中的表或者其它多個資料庫中的表。
17.2.1 TQuery部件的使用
TQuery部件是一個數據集部件,它在Delphi部件選擇板上的數據存取頁(Data Access)上,它與TTable部件具有很多共同的特性,我們在第十五章“數據存取部件的應用及程式設計”中較詳細地進行了介紹。 TQuery 部件在 SQL 程式設計中佔居了十分重要的地位。 它實現了Delphi對SQL語言的支援,在Delphi開發的資料庫應用中,SQL語句是通過TQuery部件傳遞到要存取的資料庫系統的資料庫引擎中,由資料庫引擎具體執行SQL語句, 以實現對數據的操作,而不是傳遞給Delphi中的BDE,由BDE實施具體的SQL動作。
我們已經知道了TTable部件在存取資料庫時已經具備很強大的功能。TTable部件通過Delphi內置的BDE可以實現對各種資料庫系統的存取,然而TQuery部件提供了一些 TTable部件不具備的功能,它們是: ●多表聯接查詢 ●複雜的巢狀查詢(Select中包含著Select子查詢) ●明確需要按SQL語言進行的操作
因為TTabel部件不能使用SQL語言,而在TQuery部件可以使用SQL語言,因而TQuery部件也就具備了強大的關係查詢能力。當然這也使資料庫應用程式本身變得更複雜了。 在Delphi應用程式中編寫和使用的SQL語句有兩種:即靜態SQL語句、動態SQL 語句。靜態SQL語句是在程式設計階段,將SQL命令文本作為TQuery部件的SQL屬性值設定。 而動態SQL語句程式設計是SQL語句中包含一系列的參數,在程式執行過程中各參數值是可變的,即可以動態地給SQL語句中的參數賦值。 靜態方式是把SQL命令文作為TQuery部件的SQL屬性值進行設定,這樣,當執行應用程式時,Delphi便執行TQuery部件SQL屬性中設定的SQL命令。如果是SQL中的查詢命令, 把TQuery部件通過TDataSource部件與數據控制部件相連,查詢的結果將會顯示在與 TQuery部件相連接的數據瀏覽部件中。動態SQL語句是指SQL語句中包含一些參數變數,在程式中可以為這些參數賦值,在程式執行過程中,各個參數值是變化的。TQuery部件的SQL 屬性中的SQL語句的編寫也有兩種方法,一種方法是在程式設定階段便將相應的SQL語句寫入到TQuery的SQL屬性中,另一種方法是在Delphi開發的應用程式將SQL語句,包含在Pascal代碼單元中。 在SQL程式設計中使用TQuery部件的具體方法步驟如下: ヾ為TQuery部件設定DatabaseName屬性,它可以是用BDE建立的資料庫的別名, 或桌面資料庫系統中的目錄名或資料庫伺服器中的檔案標簽,如果在應用中使用了TDatabase 部件,那麼TQuery部件的DatabaseName屬性可以是TDatabase部件中定義的一個資料庫別名。詳細情況請參看“TDatabase部件的使用”; ゝ為TQuery部件設定SQL屬性,TQuery部件的SQL屬性值就是應用程式要執行的SQL 命令文本,設定SQL屬性有兩種方法: ● 在程式設計過程中,我們可以通過物件瀏覽器(Object Inspector)編輯SQL屬性 在Object Inspector中選擇SQL屬性,這樣會打開String List Editor視窗,在其 中我們便可以編寫SQL命令,我還可以打開Visual Query Builder來編寫SQL命令 (只有Delphi的用戶/伺服器版本才具有這一工具)。 ● 將SQL命令包含在Pascal代碼單元中 在程式執行過程中,首先呼叫TQuery部件的Close方法關閉目前的TQuery部件,然 後呼叫Clear方法清除SQL屬性,並敘述新的SQL命令文本,然後呼叫Add方法,將新的SQL命令文本加入到SQL屬性中。
ゞ通過呼叫TQuery部件的Open方法或ExecSQl方法執行 SQL 命令。 Open 方法只執行Select命令,ExecSQL方法還可以執行其它的SQL命令。Open方法和ExecSQL 方法的區別我們在後面的章節�媟|進一步地加以討論的。 如果使用動態SQL語句,首先呼叫prepare方法,給動態SQL語句中的參數賦值, 然後再呼叫Open方法或ExecSQL方法。呼叫propare 方法並不是必須的, 但是對於要多次執行TQuery部件中SQL屬性中的動態SQL語句,呼叫Prepare可以大大提高TQuery部件執行SQL語句的性能。 17.2.2 在TQuery部件中編寫簡單的SQL查詢命令 在這一節�塈畯戔N學習如何使用TQuery部件編寫簡單的SQL查詢命令,並在Delphi 應用程式中實現SQL查詢。 例如,如果我們想查詢出表Customer.DB中用戶的編號和公司標簽, 我們按下列步驟來實現: ヾ在應用窗體中放置一個TQuery部件、一個TDataSource部件一個TDataGrid部件,並將它們連接起來 ゝ設定窗體TQuery 部件Query1的DatabaseName屬性值為DBDEMOS ゞ連續按兩下Object Inspector視窗中Query1的SQL 屬性, Delphi 將顯示 String List Editor視窗。 々在圖17.3中的視窗中輸入SQL語句: Select CustNo,Company From Custormer; ぁ按一下OK按鈕,關閉String List Editor視窗。 あ設定Query的Open屬性為True。 17.3 SQL語言程式設計概述 在Delphi應用程式中的SQL命令語句是包含在TQuery部件的SQL屬性中,TQuery部件的SQL屬性是TString型式的,也就是說SQL屬性值是一個字元串清單, 這個字元串清單非常類似於一個字元串型式的數群群組,有關TString型式的資訊請參看連線輔助敘述。 在前一節�塈畯怳雯苳FTQuery部件可以執行兩種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命令語句後面, 在程式執行時常常會出現出乎意料的查詢結果甚至程式無法執行下去。 在這�堶n特別注意的,一般情況下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。
17.3.3 通過TQuery部件如何獲得活動的數據
我們在前面的章節�堣雯耔Table部件時,我們知道通過TTable部件從資料庫中獲得的數據都是活動的,也就是說用戶可以直接通過數據瀏覽部件對這些數據進行編輯修改。而通過TQuery部件可以獲得兩種型式的數據: ● “活動”的數據 這種數據就跟通過TTable部件獲得的數據一樣,用戶可以通過數據瀏覽部件來編 輯修改這些數據,並且當呼叫Post方法或當焦點離開目前的數據瀏覽部件時,用戶對數據的修改自動地被寫回到資料庫中,詳細情況請參看第四章“數據瀏覽部件的應用及程式設計”。 ● 非活動的數據(唯讀數據) 用戶通過數據瀏覽部件是不能修改其中的數據。在缺省情況下,通過TQuery部件 獲得的查詢結果數據是唯讀數據,要想獲得“活動”的數據,在應用程式中必須要設定TQuery部件的RequestLive屬性值為True,然而並不是在任何情況下(通過設定RequestLive的屬值True)都可以獲得“活動”的數據的,要想獲得“活動”的數據,除了將TQuery部件的RequestLive屬性為True外,BDE要能夠返回“活動”的數據,相應的SQL命令語句還要滿足附錄C中的語法規則和下列的約束條件: TQuery部件獲得“活動”的查詢結果數據的約束條件:
當查詢Paradox或dBASE資料庫中的表: ● 查詢只能涉及到一個單獨的表 ● SQL語句中不能包含ORDER BY命令 ● SQL語句中不能含聚集運算符SUM或AVG ● 在Select後的欄位清單中不能有計算欄位 ● 在Select語句WHERE部分只能包含欄位值與常數的比較運算,這些比較運算符是: Like,>,<,>=,<=,各比較運算之間可以有並和交運算:AND和OR。
當通過SQL語句查詢資料庫伺服器中的資料庫表: ● 查詢只能涉及到一個單獨的表 ● SQL語句中不能包含ORDER BY命令 ● SQL語句中不能含聚集運算符SUM或AVG運算
另外,如果是查詢Sybase資料庫中的表,那麼被查詢的表中只能有一個索引。 如果在應用程式中要求TQuery部件返回一個“活動”的查詢結果數據集,但是SQL 命令語句不滿足上述約束條件時,對於本地資料庫的SQL查詢,BDE只能返回唯讀的數據集。對於資料庫伺服器中的SQL查詢,只能返回錯誤的代碼。當TQuery 部件返回一個“活動”的查詢結果數據集時,它的CanModify屬性的值會被設定成True。
表17.1 TQuery部件返回查詢結果數據的型式 ──────────────────────────────── RequestLive屬性值 CanModify屬性值 查詢結果的型式 ———————————————————————————————— False False 唯讀數據 True(SQL語句滿足約束條件) True “活動”數據 True(SQL語句不滿足約束條件) False 唯讀數據 ───────────────────────────────
當TQuery部件返回唯讀的查詢結果數據集,而用戶又希望修改這唯讀的數據集時,一般這樣來處理, 在應用程式中另外增加一個 TQuery 部件 Query2( 假設獲得唯讀結果的TQuery部件的名字是Query1),在Query2中設定修改語句UpDATE對Query1 中的數據進行修改操作,這樣會實現對唯讀數據的修改。
17.4 動態SQL語句的程式設計
在17.3節中,我們已經介紹了動態SQL語句(又被稱為參數化的SQL語句),在其中包含在程式過程中可以變化的參數,在實際的程式設計中使用得更多的是動態SQL語句, 因而在這一節�塈畯怑威I介紹如何給動態SQL語句的參數賦值, 以在應用程式中靈活地使用SQL語句。動態SQL語句的編寫、執行等等與17.3節中介紹的SQL語句的編寫、 執行是一樣的。 動態SQL語句中的參數,我們可以通過兩種途徑來為它賦值: 1. 利用參數編輯器(Parameter Editor)來為參數賦值 具體方法是:選中TQuery部件,按一下滑鼠右鍵,然後從中選擇Define Parameters 便可以打開參數編輯器。 例如,在TQuery部件的SQL屬性中我們設定如下的SQL語句: Setect * From Customer Where CustNO=:Number;
TQuery的DatabaseName屬性為DBDEMOS,其中Number為參數變數。我們便可以為參數Number賦值,在Datetype群群組合框中選擇該參數的數據型式為整數Integer,在Value編輯框中可以為參數Number賦一個值,也可以按一下Null Value檢查框為參數Number賦一個空值Null。給參數賦值之後,按一下OK按鈕,這樣TQuery部件中的SQL 查詢便準備好了,而且參數值也被賦給了動態SQL語句中相應的參數,此時當把TQuery 部件的Active屬性設定成True時,在與TQuery部件相連的數據瀏覽部件中會顯示出查詢結果,通過參數編輯器為參數賦值,這種方式缺乏應有的靈活性,在實際應用中用得較少,在實際應用中程式設計人員希望用更靈活方便的方式為參數賦值,那就是我們接下來要介紹的另一種途徑: 2. 在執行過程中,通過程式為參數賦值 用這種方式為參數賦值有三種方法: ヾ根據參數在SQL語句中出現的順序,設定TQuery部件的Params屬性值為參數賦值。 ゝ直接根據SQL語句中各參數的名字,呼叫ParamByName方法來為各參數賦值。 ゞ將TQuery部件的DataSource屬性設定為另一個數據源,這樣將另一個數據源中與目前TQuery部件的SQL語句中的參數名相匹配的欄位值賦給其對應的參數。 這三種方法我們將在下面的三小節中具體地介紹
17.4.1 使用Params屬性為參數賦值
TQuery部件具有一個Params屬性,它們在設計時不可用,在程式執行過程中可用,並且是動態建立的,當為TQuery部件編寫動態SQL 語句時, Delphi 會自動地建立一個數群群組Params,數群群組Params是以0下標開始的,依次對應動態SQL 語句中的參數, 也就是說動態SQL語句中第一個參數對應Params[0],第二個參數對應params[1],依此類推。 例如:一個TQuery部件Query1,我們為它編寫的動態SQL語句是:
Insert Into Customer(CustNo,Name,Country) Values(:CustNo,:Name, : Country)
對於上述這條動態SQL語句中的參數,我們可以利用TQuery部件的params 屬性為參數賦值:
Query1.params[0].AsString := "1988"; Query1.params[1].AsString := "Lichtenstein"; Query1.params[2].AsString := "USA";
上述語句將把"1988"賦給參數:Cuse_No,"Lichtenstein"賦給參數:Name,"USA"賦給參數:Country。
17.4.2 使用ParamByName方法為參數賦值
ParamByName是一個函數,用動態SQL語句中的參數作為呼叫ParamByName函數的參數,這樣便可以為它們賦值,使用這種賦值方法,必須要知道動態SQL語句參數的名字。 例如在17.4.1節中的例子中,也可以用下述方法給參數賦值:
Query1.ParamByName('CustNo').AsString := "1988"; Query1.ParamByName('Name').AsString := "Lichtenstein"; Query1.ParamByName('Country').AsString := "USA";
使用這種方法同樣可以為各參數賦值,而且更加直觀一些。
17.4.3 使用Datasource屬性為參數賦值
上述兩種方法的共同特點是:我們在為各參數賦值時,我們是知道各參數對應的具體參數值的。而在具體的應用程式中,有些參數值常常是無法確定的,例如參數值來自於另一個查詢結果,對於這種情況,Delphi提供了使用Datasource屬性為動態SQL 語句中尚存在沒有賦值的參數時, Delphi 會自動檢查 TQuery 部件的 Datasource 屬性, 如果為Datasource屬性設定了屬性值(該屬性的值是另一個TDatasource部件的名字),Delphi 會把沒有賦值的參數與TDatasource部件中的各欄位比較,Delphi 會將相應的欄位值賦給與其相匹配的參數,利用這種方法也能實現所謂的連接查詢,我們在學習使用TTable部件時,便會建立主要--明細型資料庫應用,用TQuery部件建立的連接查詢與主要- -明細型應用是相似的。 例如:在如圖17.7所示的應用中,設定了下列部件: ● 一個TTable部件 名字為Cust,它的DatabaseName屬性為DEMOS,TableName屬性為Customer。 ● 一個TDatasource部件 名字為Custsource,其Dataset屬性被設定為Cust。 ● 一個TQuery部件 名字為ORDERS,其DatabaseName被設定為DEMOS,SQL屬性值為:
Select Orders.CustNo,Orders.OrderNo,Orders.SaleDate FROM Orders WHERE Orders.CustNo =: CustNo
ORDERS的DataSouce屬性被設定為CustSource ● 一個TDatasource部件 名字為OrderSource,其DataSet屬性被設定為Orders。 ● 兩個TDBGrid部件 它們分別連接CustSource和OrderSource。 TQuery部件Orders中的動態SQL語句中的參數:CustNo在程式設計過程中沒有給它賦值,當該應用程式執行時Delphi會自動地到其Datasource屬性中敘述的數據源CustSource中找到與參數:CustNo匹配的欄位,而CustSource中正好有一個名字為 CustNo 的欄位與參數:CustNo匹配,這樣Customer表中的CustNo欄位值被賦給了參數 : CustNo , 而當每移動Customer表中的記錄指標,參數:CustNo的值會隨之改變,而參數:CustNo的值發生改變時,Orders中的動態SQL語句會根據新的參數值重新查詢,從資料庫表中獲取相應的訂單數據,這樣也變實現了類似於主要--明細型應用。即連接查詢。 17.4.4 Prepare方法的使用 在使用動態SQL語句程式設計時,常常用到一個很重要的方法prepare,呼叫prepare 方法之後,Delphi會將帶參數的SQL語句轉送給與其對應的資料庫引擎,對動態SQL語句進行語法分析和優化。雖然在用動態SQL語句程式設計時,呼叫prepare方法並不是必須的,但是這�塈畯怑n極力推薦呼叫prepare方法,因為呼叫prepare方法後,會大大提高動態SQL 語句的執行性能,特別是當要反復多次執行同一條動態SQL語句時,其優越性會更加明顯。 如果在應用程式中執行一條SQL語句之前並沒有顯式地呼叫prepare方法,每次在執行SQL 語句時,Delphi會隱含地呼叫propare方法以準備這個查詢。 TQuery部件還有一個prepare屬性,這是一個布爾型屬性,當其屬性值為True時, 表明該查詢已被準備好了( SQL 語句已被轉送到資料庫引擎中 ) , 當我們使用參數編輯器Parameters Editor來為動態SQL語句中的參數賦值時,當設定完相應的參數值並結束參數編輯器時,Delphi會隱含地呼叫prepare方法以準備好查詢。 當SQL語句執行完之後,要想準備下一個查詢,首先必須呼叫close方法,然後才能呼叫prepare方法準備下一個查詢。一般來說,在一個應用程式中應該呼叫一次prepare方法,常常在窗體的OnCreate事件處理過程中呼叫prepare方法, 然後用上述介紹的方法為參數賦值,最後呼叫Open方法或ExecSQL方法執行SQL語句,以完成查詢。 當然在呼叫prepare方法準備好一個查詢時,會消耗一些資料庫資源, 因而每當一個查詢執行完畢之後,要養成呼叫Unprepare方法以復原查詢的好習慣。在執行程式過程中,通過程式改變TQuery部件的SQL屬性值時,Delphi會自動地呼叫Close方法和Unprepare 方法,以復原查詢。
|
後一頁 前一頁 回目錄 回首頁 |