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

Delphi數據庫編程新手指南(07)

編輯:Delphi

TADOQuery組件通過調用SQL語句,來獲取ADO數據庫中一個或多個表的數據。

這些SQL語句可以是​​DDL(數據定義語言)語句,如CREATE TABLE、ALTER INDEX等等;也可以是DML(數據操縱語言)語句,如SELECT、UPDATE和DELETE。不過,最常用的還是SELECT語句——生成一個類似使用Table組件時的視圖。

注意:雖然ADOQuery組件也可用來執行指令,但更恰當的方式是用ADOCommand組件。因其不會返回結果集,常用來執行DDL指令或存儲過程(即使對於這樣的操作你更應使用TADOStoredProc)。

ADOQuery組件使用的SQL必須與正在使用的ADO驅動程序相匹配。換句話說,你應該熟悉不同SQL間的差異,例如,MS Access和MS SQL。

使用ADOTable組件訪問數據庫中的數據,必須使其與數據庫建立連接——通過它的ConnectionString屬性或在Connection屬性中指定單獨的ADOConnection組件。

創建一個Delphi窗體,使其能從Access數據庫中檢索數據。簡單放置幾個相關的數據訪問、感知組件,以及ADOQuery,並像前幾章那樣將它們關聯起來即可。數據訪問組件:DataSource、ADOConnection以及ADOQuery;數據感知組件:如DBGrid。

如前所述,通過使用ObjectInspector來設置這些組件之間的關系:


[delphi]
DBGrid1.DataSource =DataSource1 
DataSource1.DataSet = ADOQuery1 
ADOQuery1.Connection =ADOConnection1 
//使用第二章的方法來創建ConnectionString  
ADOConnection1.ConnectionString= ... 
ADOConnection1.LoginPrompt =False 

DBGrid1.DataSource =DataSource1
DataSource1.DataSet = ADOQuery1
ADOQuery1.Connection =ADOConnection1
//使用第二章的方法來創建ConnectionString
ADOConnection1.ConnectionString= ...
ADOConnection1.LoginPrompt =False執行一個SQL查詢(Doing a SQL query)

  TADOQuery組件不像TADOTable那樣具有TableName屬性。它有一個SQL屬性(TStrings類型)——用來存儲SQL語句。可以在設計時通過Object Inspector或在運行時通過代碼中來設置SQL屬性的值。

  設計時,在Object Inspector的SQL屬性中單擊‘…’按鈕,調用屬性編輯器,並鍵入以下SQL語句:“SELECT * FROM Authors”。

  根據語句的類型,將用下列兩種方法之一來執行SQL語句。數據定義語句通常用ExecSQL方法執行。例如,要從某個表中刪除某條特定記錄,可以寫一條DELETE DDL語句,並運行Query的ExecSQL方法。執行(普通)SQL語句,將TADOQuery.Active屬性設為True或調用Open方法(它們本質上是相同的)。此方法類似用TADOTable組件檢索表數據。

在運行時,可以將SQL屬性中的SQL語句作為StringList對象使用:


[delphi] 
with ADOQuery1 do begin 
  Close; 
  SQL.Clear; 
  SQL.Add('SELECT * FROMAuthors '); 
  SQL.Add('ORDER BYauthorname DESC'); 
  Open; 
end; 

with ADOQuery1 do begin
  Close;
  SQL.Clear;
  SQL.Add('SELECT * FROMAuthors ');
  SQL.Add('ORDER BYauthorname DESC');
  Open;
end;上述代碼,在運行期間關閉數據集,清空SQL屬性中的SQL字符串,賦給新的SQL指令並通過調用Open方法激活數據集。


注意,用ADOQUERY組件來創建字段對象的持久性列表,顯然是沒有任何意義的。因在下一次調用Open方法時,SQL可能已完全不同,其整個提交集的名稱(和類型)都可能會改變。當然,如果只用ADOQUERY從某個表的固定字段集中取行;以及結果集依賴於該SQL語句的WHERE部分時例外。

 動態查詢(Dynamic queries)

  TADOQuery組件最為突出的優點便是Params屬性。參數化查詢即在一個SQL語句的WHERE子句中使用參數,進行靈活的行/列選擇。該Params屬性允許在預置的SQL語句中設置替換參數。一個參數是一個占位符,作為WHERE子句中的值,需在進行查詢之前定義。要在查詢語句中指定一個參數,可在參數名稱前使用冒號(:)。

  設計時用Object Inspector設置SQL屬性,如下所示:


[delphi] 
ADOQuery1.SQL := 'SELECT *FROM Applications WHERE type = :apptype' 

ADOQuery1.SQL := 'SELECT *FROM Applications WHERE type = :apptype'  關閉SQL屬性編輯器後,在Object Inspector中單擊Parameters屬性後的”…”按鈕,即可打開參數編輯窗口,呈現出前面SQL語句中被命名為APPTYPE的參數。通過參數編輯窗口我們可以在設計時設置參數集合內的參數值,但在多數情況下,我們需要在運行時改變參數。參數編輯器可用於指定參數的數據類型和默認值。

  這些參數可以在運行時被改變,這時,查詢將重新執行並刷新數據。為了實現參數化查詢,我們需在執行該查詢之前為每個參數提供一個值。要修改參數值,我們可以使用Params屬性或ParamByName方法。例如下面給定的SQL語句,在運行時,可用以下代碼更改參數:


[delphi] 
with ADOQuery1 do 
begin 
    Close; 
    SQL.Clear; 
    SQL.Add('SELECT* FROM Applications WHERE type =:apptype'); 
    Parameters.ParamByName('apptype').Value:='graphics'; 
    Open; 
end; 

with ADOQuery1 do
begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT* FROM Applications WHERE type =:apptype');
    Parameters.ParamByName('apptype').Value:='graphics';
    Open;
end;
浏覽和編輯查詢(Navigating andediting the query)

  用ADOQUERY返回一組或一個(多個)表中的記錄,與通過導航條浏覽ADOTable組件中的數據集(“Behind data in datasets”一章中)方法是類似的。

一般來說,當數據集被編輯時,不應使用ADOQUERY組件。因為基於SQL的查詢主要用於報表顯示,而此時查詢返回的結果,可能來至於一個正在被編輯的數據集(造成前後數據不一致)。只有從單一表、且不使用任何SQL聚合函數時,用ADOQUERY還是ADOTAble,其返回的結果集都是相同的。

實例(An example)

  我們將編寫一個小例子來了解ADOQUERY的一些方法——一個可用於從數據庫中的各個表中提取行的查詢。要列出數據庫中的所有表,我們可以用ADOConnection組件的GetTableNames方法。在窗體的OnCreate事件添加GetTableNames,將得到的字段列表依次增加到ComboBox組件中。按鈕(Button)用來關閉查詢並重新拾取表檢索記錄。事件處理程序如下:


[delphi]
procedureTForm1.FormCreate(Sender: TObject); 
begin 
 ADOConnection1.GetTableNames(ComboBox1.Items); 
end; 
  
procedure TForm1.Button1Click(Sender:TObject); 
var  tblname : string; 
begin 
if ComboBox1.ItemIndex < 0then Exit; 
tblname :=ComboBox1.Items[ComboBox1.ItemIndex]; 
with ADOQuery1 do begin 
  Close; 
  SQL.Text := 'SELECT * FROM ' + tblname; 
  Open; 
end; 
end; 

procedureTForm1.FormCreate(Sender: TObject);
begin
 ADOConnection1.GetTableNames(ComboBox1.Items);
end;
 
procedure TForm1.Button1Click(Sender:TObject);
var  tblname : string;
begin
if ComboBox1.ItemIndex < 0then Exit;
tblname :=ComboBox1.Items[ComboBox1.ItemIndex];
with ADOQuery1 do begin
  Close;
  SQL.Text := 'SELECT * FROM ' + tblname;
  Open;
end;
end;
  注,使用ADOTable的TableName屬性會顯得更簡單。

 

 

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