当前位置:编程学习 > Delphi >>

Delphi数据库编程新手指南(07)

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属性会显得更简单。

 

 

补充:软件开发 , Delphi ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,