程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 第十七章-SQL編程(一)(4)

第十七章-SQL編程(一)(4)

編輯:Delphi

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方法並不是必須的,但是這裡我們要極力推薦調用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 方法,以撤消查詢。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved