利用參數編輯器(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部件相連的數據浏覽部件中會顯示出查詢結果通過參數編輯器為參數賦值這種方式缺乏應有的靈活性在實際應用中用得較少在實際應用中程序設計人員希望用更靈活方便的方式為參數賦值那就是我們接下來要介紹的另一種途徑
在運行過程中通過程序為參數賦值
用這種方式為參數賦值有三種方法
①根據參數在SQL語句中出現的順序設置TQuery部件的Params屬性值為參數賦值
②直接根據SQL語句中各參數的名字調用ParamByName方法來為各參數賦值
③將TQuery部件的DataSource屬性設置為另一個數據源這樣將另一個數據源中與當前TQuery部件的SQL語句中的參數名相匹配的字段值賦給其對應的參數
這三種方法我們將在下面的三小節中具體地介紹
使用Params屬性為參數賦值
TQuery部件具有一個Params屬性它們在設計時不可用在程序運行過程中可用並且是動態建立的當為TQuery部件編寫動態SQL 語句時 Delphi 會自動地建立一個數組Params數組Params是以下標開始的依次對應動態SQL 語句中的參數 也就是說動態SQL語句中第一個參數對應Params[]第二個參數對應params[]依此類推
例如一個TQuery部件Query我們為它編寫的動態SQL語句是
Insert Into Customer(CustNoNameCountry)
Values(CustNo:Name : Country)
對於上述這條動態SQL語句中的參數我們可以利用TQuery部件的params 屬性為參數賦值
Queryparams[]AsString := ;
Queryparams[]AsString := Lichtenstein;
Queryparams[]AsString := USA;
上述語句將把賦給參數Cuse_NoLichtenstein賦給參數NameUSA賦給參數Country
使用ParamByName方法為參數賦值
ParamByName是一個函數用動態SQL語句中的參數作為調用ParamByName函數的參數這樣便可以為它們賦值使用這種賦值方法必須要知道動態SQL語句參數的名字
例如在節中的例子中也可以用下述方法給參數賦值
QueryParamByName(CustNo)AsString := ;
QueryParamByName(Name)AsString := Lichtenstein;
QueryParamByName(Country)AsString := USA;
使用這種方法同樣可以為各參數賦值而且更加直觀一些
使用Datasource屬性為參數賦值
上述兩種方法的共同特點是我們在為各參數賦值時我們是知道各參數對應的具體參數值的而在具體的應用程序中有些參數值常常是無法確定的例如參數值來自於另一個查詢結果對於這種情況Delphi提供了使用Datasource屬性為動態SQL 語句中尚存在沒有賦值的參數時 Delphi 會自動檢查 TQuery 部件的 Datasource 屬性 如果為Datasource屬性設置了屬性值(該屬性的值是另一個TDatasource部件的名字)Delphi 會把沒有賦值的參數與TDatasource部件中的各字段比較Delphi 會將相應的字段值賦給與其相匹配的參數利用這種方法也能實現所謂的連接查詢我們在學習使用TTable部件時便會創建主要明細型數據庫應用用TQuery部件創建的連接查詢與主要 明細型應用是相似的
例如在如圖所示的應用中設置了下列部件
● 一個TTable部件
名字為Cust它的DatabaseName屬性為DEMOSTableName屬性為Customer
● 一個TDatasource部件
名字為Custsource其Dataset屬性被設置為Cust
● 一個TQuery部件
名字為ORDERS其DatabaseName被設置為DEMOSSQL屬性值為
Select OrdersCustNoOrdersOrderNoOrdersSaleDate FROM Orders
WHERE OrdersCustNo =: 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語句會根據新的參數值重新查詢從數據庫表中獲取相應的訂單數據這樣也變實現了類似於主要明細型應用即連接查詢
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 方法以撤消查詢
返回目錄DELPHI基礎教程
編輯推薦
Java程序設計培訓視頻教程
JEE高級框架實戰培訓視頻教程
Visual C++音頻/視頻技術開發與實戰
Oracle索引技術
ORACLEG數據庫開發優化指南
Java程序性能優化讓你的Java程序更快更穩定
C嵌入式編程設計模式
Android游戲開發實踐指南
[] [] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25147.html