优秀的编程知识分享平台

网站首页 > 技术文章 正文

「10.Delphi数据库编程」8.ADO组件之ADOQuery组件

nanyue 2024-09-14 06:27:43 技术文章 5 ℃

8.ADO组件之ADOQuery组件

Delphi 的 ADO 组件中另外一个重要的数据集组件是 ADOQuery 组件,需要使用 SQL 语句来进行查询。

8.1 ADOQuery 与 ADOTable 的区别

  • ADOQuery 组件的主要功能是用来支持 SQL 语句访问本地或远程数据库。
  • ADOQuery 组件允许同时访问多个表,而 ADOTable 组件一次只能访问一个表。
  • ADOQuery 组件访问的是表中的一个子数据集,即符合条件的特定的数据;而 ADOTable 组件一般访问的是表上的全部数据。
  • ADOQuery 组件在只有使用 SQL 语句才能完成查询的时候必须使用该组件,支持复杂的嵌套查询。

8.2 ADOQuery 组件的主要属性

  • SQL - 字符串类型,包含了需要执行的查询的 SQL 语句

在 Delphi 应用程序中使用的 SQL 语句可以分为两种:静态 SQL 语句和动态 SQL 语句。

静态 SQL 语句在程序设计阶段,将 SQL 语句作为 ADOQuery 组件的 SQL 属性值设置,可以通过对象查看器进行设置。

动态 SQL 语句则在程序运行过程中进行设置,可以动态地给 SQL 语句的参数赋值。在代码中实现查询的步骤如下:

  1. 调用 ADOQuery 组件的 Close 方法关闭组件;
  2. 调用 ADOQuery.SQL 的 Clear 方法清除原来的 SQL 语句;
  3. 调用 ADOQuery.SQL 的 Add 方法添加新的 SQL 语句;
  4. 调用 ADOQuery 的 Open 方法或 ExecSQL 方法执行 SQL 语句;

如:

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from customers');
ADOQuery1.Open; 或者 ADOQuery1.ExecSQL;
  • Active

可以通过设置 Active 属性为 True 来执行 SQL 语句,一般情况下,通过 ExecSQL 来运行 SQL 语句。如果执行的 SQL 语句有结果集,则可与通过 Open 方法来运行 SQL 语句。

  • Parameters

该属性为 TParameters 类型,包含了 SQL 语句中使用的参数。在运行中可以访问 Parameters 属性中的参数,也可以通过该属性给 SQL 参数进行赋值。如:

ADOQuery.SQL.Add(''SELECT * FROM customers WHERE customer_id = :AnId;');

Param := ADOQuery.Parameters.ParamByName('AnId');
Param.DataType := ftInteger;
Param.Value := 1;

ADOQuery.Prepared := true;

try
  ADOQuery.Active := True;
except
  on e: EADOError do
  begin
    MessageDlg('Error while doing query', mtError, [mbOK], 0);
    Exit;
  end;
end;
  • DataSource

该属性为动态 SQL 语句中存在未赋值的参数时,Delphi 会自动检查 ADOQuery 组件的 DataSource 属性,如果为该属性设置了属性值,则会把没有赋值的参数与 DataSource 组件中的各个字段比较,自动将相应的字段赋值给与其相匹配的参数,实现连接查询。

  • Prepared

在执行查询时,可以让数据库查询分配资源并执行查询优化,也称为执行查询前的准备工作。在执行查询前设置该属性为 True 会提高应用程序的性能。

8.3 ADOQuery 组件的主要方法

  • Open

SQL 语句可以分为两种,带有结果集的查询和执行数据库维护功能的 SQL 语句。一般情况下,Open 方法用于执行带有结果集的查询。

  • ExecSQL

一般情况下,ExecSQL 方法用于执行没有结果集返回的 SQL 语句。不过,Delphi 并没有规定在哪种情况下一定要使用哪种方法,可以使用 Open 来执行所有的 SQL 语句。

8.4 动态查询

ADOQuery 组件的动态 SQL 语句是指带有参数的 SQL 语句,参数的值在运行过程中动态确定,在程序执行期间参数的值是可变的。如:

select * from customers where name = :NAME;

其中:“:NAME” 就是动态 SQL 的参数,运行时必须给定数据。

在 ADOQuery 组件中,该组件提供了 Parameters 属性来为参数赋值。

设计期:

单击 ADOQuery 组件的 Parameters 属性右侧的 ... 按钮,如下图所示:

在参数对话框中选择某个参数名称,在对象观察器中可以设置该参数的属性,包括参数类型、参数值等。

运行期:

在运行期,可以使用 Parameters 属性,以数组的方式进行访问和设置,也可以使用 ParamByName 方法获取对应的参数并进行设置。如:

Param := ADOQuery.Parameters.ParamByName('AnId');
Param.DataType := ftInteger;
Param.Value := 1;

8.5 动态查询示例

示例1:输入姓名查询数据

界面设计如下图所示:

组件及属性:

组件

属性

Panel1

Align

alTop


Caption

''

Label1

Caption

'姓名'

Edit1

Text

''

Button1

Caption

'查询'

ADOConnection1

ConnectionString

Provider=MSDASQL.1;Persist Security Info=False;Data Source=demodb;


LoginPrompt

False


Connected

True

ADOQuery1

Connection

ADOConnection1


SQL

select * from d_students where name =:NAME


Active

False

DataSource1

DataSet

ADOQuery1

DBGrid1

Align

alClient


DataSource

DataSource1

代码示例:

procedure TForm1.Button1Click(Sender: TObject);
var
  Param: TParameter;
begin
  with ADOQuery1 do
  begin
    Close;
    Param := Parameters.ParamByName('NAME');
    Param.DataType := ftString;
    Param.Value :=  Edit1.Text;

    Prepared := True;
    Open;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ADOConnection1.LoginPrompt := False;
  ADOConnection1.Open();
end;

示例2:输入任意 SQL 语句执行

界面设计如下:

组件及属性设置参照上例。

示例代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add(Memo1.Lines.Text);
    Prepared := True;
    Active := True;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with ADOConnection1 do
  begin
    LoginPrompt := False;
    Open;
  end;
end;
最近发表
标签列表