?? 041.htm
字號:
<p>表17.1 TQuery部件返回查詢結果數據的類型</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p>RequestLive屬性值 CanModify屬性值 查詢結果的類型</p>
<p>────────────────────────────────</p>
<p>False False 只讀數據</p>
<p>True(SQL語句滿足約束條件) True “活動”數據</p>
<p>True(SQL語句不滿足約束條件) False 只讀數據</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p> </p>
<p>當TQuery部件返回只讀的查詢結果數據集,而用戶又希望修改這只讀的數據集時,一般這樣來處理,
在應用程序中另外增加一個 TQuery 部件 Query2( 假設獲得只讀結果的TQuery部件的名字是Query1),在Query2中設置修改語句UpDATE對Query1
中的數據進行修改操作,這樣會實現對只讀數據的修改。</p>
<p> </p>
<p>17.4 動態SQL語句的編程</p>
<p> </p>
<p>在17.3節中,我們已經介紹了動態SQL語句(又被稱為參數化的SQL語句),在其中包含在程序過程中可以變化的參數,在實際的程序設計中使用得更多的是動態SQL語句,
因而在這一節里我們重點介紹如何給動態SQL語句的參數賦值,
以在應用程序中靈活地使用SQL語句。動態SQL語句的編寫、執行等等與17.3節中介紹的SQL語句的編寫、
執行是一樣的。</p>
<p>動態SQL語句中的參數,我們可以通過兩種途徑來為它賦值:</p>
<p>1. 利用參數編輯器(Parameter Editor)來為參數賦值</p>
<p>具體方法是:選中TQuery部件,單擊鼠標右鍵,然后從中選擇Define
Parameters 便可以打開參數編輯器。 </p>
<p>例如,在TQuery部件的SQL屬性中我們設置如下的SQL語句: </p>
<p>Setect * From Customer Where CustNO=:Number;</p>
<p> </p>
<p>TQuery的DatabaseName屬性為DBDEMOS,其中Number為參數變量。我們便可以為參數Number賦值,在Datetype組合框中選擇該參數的數據類型為整數Integer,在Value編輯框中可以為參數Number賦一個值,也可以單擊Null
Value檢查框為參數Number賦一個空值Null。給參數賦值之后,單擊OK按鈕,這樣TQuery部件中的SQL
查詢便準備好了,而且參數值也被賦給了動態SQL語句中相應的參數,此時當把TQuery
部件的Active屬性設置成True時,在與TQuery部件相連的數據瀏覽部件中會顯示出查詢結果,通過參數編輯器為參數賦值,這種方式缺乏應有的靈活性,在實際應用中用得較少,在實際應用中程序設計人員希望用更靈活方便的方式為參數賦值,那就是我們接下來要介紹的另一種途徑:</p>
<p>2. 在運行過程中,通過程序為參數賦值</p>
<p>用這種方式為參數賦值有三種方法:</p>
<p>①根據參數在SQL語句中出現的順序,設置TQuery部件的Params屬性值為參數賦值。</p>
<p>②直接根據SQL語句中各參數的名字,調用ParamByName方法來為各參數賦值。</p>
<p>③將TQuery部件的DataSource屬性設置為另一個數據源,這樣將另一個數據源中與當前TQuery部件的SQL語句中的參數名相匹配的字段值賦給其對應的參數。</p>
<p>這三種方法我們將在下面的三小節中具體地介紹</p>
<p> </p>
<p>17.4.1 使用Params屬性為參數賦值</p>
<p> </p>
<p>TQuery部件具有一個Params屬性,它們在設計時不可用,在程序運行過程中可用,并且是動態建立的,當為TQuery部件編寫動態SQL
語句時, Delphi 會自動地建立一個數組Params,數組Params是以0下標開始的,依次對應動態SQL
語句中的參數, 也就是說動態SQL語句中第一個參數對應Params[0],第二個參數對應params[1],依此類推。</p>
<p>例如:一個TQuery部件Query1,我們為它編寫的動態SQL語句是:</p>
<p> </p>
<p>Insert Into Customer(CustNo,Name,Country)</p>
<p>Values(:CustNo,:Name, : Country)</p>
<p> </p>
<p>對于上述這條動態SQL語句中的參數,我們可以利用TQuery部件的params
屬性為參數賦值:</p>
<p> </p>
<p>Query1.params[0].AsString := "1988";</p>
<p>Query1.params[1].AsString := "Lichtenstein";</p>
<p>Query1.params[2].AsString := "USA";</p>
<p> </p>
<p>上述語句將把"1988"賦給參數:Cuse_No,"Lichtenstein"賦給參數:Name,"USA"賦給參數:Country。</p>
<p> </p>
<p>17.4.2 使用ParamByName方法為參數賦值</p>
<p> </p>
<p>ParamByName是一個函數,用動態SQL語句中的參數作為調用ParamByName函數的參數,這樣便可以為它們賦值,使用這種賦值方法,必須要知道動態SQL語句參數的名字。</p>
<p>例如在17.4.1節中的例子中,也可以用下述方法給參數賦值:</p>
<p> </p>
<p>Query1.ParamByName('CustNo').AsString := "1988";</p>
<p>Query1.ParamByName('Name').AsString := "Lichtenstein";</p>
<p>Query1.ParamByName('Country').AsString := "USA";</p>
<p> </p>
<p>使用這種方法同樣可以為各參數賦值,而且更加直觀一些。</p>
<p> </p>
<p>17.4.3 使用Datasource屬性為參數賦值</p>
<p> </p>
<p>上述兩種方法的共同特點是:我們在為各參數賦值時,我們是知道各參數對應的具體參數值的。而在具體的應用程序中,有些參數值常常是無法確定的,例如參數值來自于另一個查詢結果,對于這種情況,Delphi提供了使用Datasource屬性為動態SQL
語句中尚存在沒有賦值的參數時, Delphi 會自動檢查 TQuery 部件的
Datasource 屬性, 如果為Datasource屬性設置了屬性值(該屬性的值是另一個TDatasource部件的名字),Delphi
會把沒有賦值的參數與TDatasource部件中的各字段比較,Delphi
會將相應的字段值賦給與其相匹配的參數,利用這種方法也能實現所謂的連接查詢,我們在學習使用TTable部件時,便會創建主要--明細型數據庫應用,用TQuery部件創建的連接查詢與主要-
-明細型應用是相似的。</p>
<p>例如:在如圖17.7所示的應用中,設置了下列部件:</p>
<p>● 一個TTable部件</p>
<p>名字為Cust,它的DatabaseName屬性為DEMOS,TableName屬性為Customer。</p>
<p>● 一個TDatasource部件</p>
<p>名字為Custsource,其Dataset屬性被設置為Cust。</p>
<p>● 一個TQuery部件</p>
<p>名字為ORDERS,其DatabaseName被設置為DEMOS,SQL屬性值為:</p>
<p> </p>
<p>Select Orders.CustNo,Orders.OrderNo,Orders.SaleDate FROM Orders</p>
<p>WHERE Orders.CustNo =: CustNo</p>
<p> </p>
<p>ORDERS的DataSouce屬性被設置為CustSource</p>
<p>● 一個TDatasource部件</p>
<p>名字為OrderSource,其DataSet屬性被設置為Orders。</p>
<p>● 兩個TDBGrid部件</p>
<p>它們分別連接CustSource和OrderSource。</p>
<p>TQuery部件Orders中的動態SQL語句中的參數:CustNo在程序設計過程中沒有給它賦值,當該應用程序運行時Delphi會自動地到其Datasource屬性中說明的數據源CustSource中查找與參數:CustNo匹配的字段,而CustSource中正好有一個名字為
CustNo 的字段與參數:CustNo匹配,這樣Customer表中的CustNo字段值被賦給了參數
: CustNo , 而當每移動Customer表中的記錄指針,參數:CustNo的值會隨之改變,而參數:CustNo的值發生改變時,Orders中的動態SQL語句會根據新的參數值重新查詢,從數據庫表中獲取相應的訂單數據,這樣也變實現了類似于主要--明細型應用。即連接查詢。 </p>
<p>17.4.4 Prepare方法的使用 </p>
<p>在使用動態SQL語句編程時,常常用到一個很重要的方法prepare,調用prepare
方法之后,Delphi會將帶參數的SQL語句傳送給與其對應的數據庫引擎,對動態SQL語句進行語法分析和優化。雖然在用動態SQL語句編程時,調用prepare方法并不是必須的,但是這里我們要極力推薦調用prepare方法,因為調用prepare方法后,會大大提高動態SQL
語句的執行性能,特別是當要反復多次執行同一條動態SQL語句時,其優越性會更加明顯。
如果在應用程序中執行一條SQL語句之前并沒有顯式地調用prepare方法,每次在執行SQL
語句時,Delphi會隱含地調用propare方法以準備這個查詢。</p>
<p>TQuery部件還有一個prepare屬性,這是一個布爾型屬性,當其屬性值為True時,
表明該查詢已被準備好了( SQL 語句已被傳送到數據庫引擎中 ) ,
當我們使用參數編輯器Parameters Editor來為動態SQL語句中的參數賦值時,當設置完相應的參數值并退出參數編輯器時,Delphi會隱含地調用prepare方法以準備好查詢。</p>
<p>當SQL語句執行完之后,要想準備下一個查詢,首先必須調用close方法,然后才能調用prepare方法準備下一個查詢。一般來說,在一個應用程序中應該調用一次prepare方法,常常在窗體的OnCreate事件處理過程中調用prepare方法,
然后用上述介紹的方法為參數賦值,最后調用Open方法或ExecSQL方法執行SQL語句,以完成查詢。</p>
<p>當然在調用prepare方法準備好一個查詢時,會消耗一些數據庫資源,
因而每當一個查詢執行完畢之后,要養成調用Unprepare方法以撤消查詢的好習慣。在運行程序過程中,通過程序改變TQuery部件的SQL屬性值時,Delphi會自動地調用Close方法和Unprepare
方法,以撤消查詢。</font></p>
<p> </p>
<hr color="#EE9B73" size="1" width="94%">
</TD>
<TD CLASS="tt3" VALIGN="bottom" width="8%" bgcolor="#e0e0e0"><strong><A HREF="042.htm"><FONT style="FONT-SIZE: 9pt">后一頁</font></A><BR>
<A HREF="040.htm"><FONT style="FONT-SIZE: 9pt">前一頁</font></A><BR>
<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目錄</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首頁</font></A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -